# Kleinanzeigen.de Scraper - Ads, Prices & New Listings Monitor (`aidnurs/kleinanzeigen-scraper`) Actor

Scrape Kleinanzeigen.de (ex eBay Kleinanzeigen) by keyword, category or city: title, price, VB flag, location, date, shipping, PRO seller and full description. Only new ads mode for alerts. Duplicates are free, phones masked.

- **URL**: https://apify.com/aidnurs/kleinanzeigen-scraper.md
- **Developed by:** [Nursultan Imanov](https://apify.com/aidnurs) (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 $1.00 / 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.

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.de Scraper do?

**Kleinanzeigen.de Scraper** extracts classified ads from [Kleinanzeigen.de](https://www.kleinanzeigen.de) (formerly eBay Kleinanzeigen), Germany's largest marketplace. Search by keyword, category or city and get clean, structured data: **title, price (number + VB flag), postal code, city, posting time, shipping, direct-buy, PRO seller, photos** and, optionally, the **full description, attributes (condition, type, size...), all photos, shipping price and category**.

Use it as a **Kleinanzeigen API** for deal alerts, reselling and arbitrage, price research, market monitoring, or lead lists of commercial (PRO) sellers.

### Why use this Kleinanzeigen scraper?

- 🔔 **Only new ads since the last run.** Turn on *Only new ads*, schedule the Actor every 10-30 minutes and get just the fresh listings. Perfect for deal alerts.
- 💶 **Price as a number.** `"45 € VB"` becomes `price: 45`, `priceNegotiable: true`; free items get `isFree: true`.
- 🎯 **Filters that work.** Min/max price, private or PRO sellers, shipping only, skip "Gesuch" (wanted) ads and paid top ads.
- 🔁 **No duplicates charged.** An ad found by several searches is saved and billed once.
- 🛡️ **Privacy by default.** Private sellers' names and street addresses are never collected; phone numbers and e-mails in descriptions are masked.
- ⚡ **Fast and cheap.** Plain HTTP, no browser: 300 ads in about 30 seconds.

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

You pay per ad saved to the dataset, plus a small extra per ad when *Include full ad details* is on. Duplicates and filtered-out ads are free. Cap spending with *Max ads* and the run's maximum cost.

### How to scrape Kleinanzeigen.de

1. Enter **Keywords** (`ipad`, `rennrad`, `ikea kallax`) to search all of Germany, and/or
2. Paste **Search URLs** from your browser to search a city or category (e.g. `https://www.kleinanzeigen.de/s-berlin/ipad/k0l3331`, `https://www.kleinanzeigen.de/s-fahrraeder/c217`).
3. Set filters (price, seller type, shipping) and **Max ads**.
4. For alerts: turn on **Only new ads** and add a schedule.
5. Click **Start** and download JSON, CSV or Excel, or use the Apify API.

Each search reads the first 5 result pages (about 130 newest ads), which is what Kleinanzeigen allows automated visitors to read. To cover more, add more keywords, cities or categories: they run in one go and duplicates are removed.

### Input example

```json
{
  "keywords": ["ipad", "rennrad"],
  "searchUrls": ["https://www.kleinanzeigen.de/s-berlin/ipad/k0l3331"],
  "maxItems": 300,
  "maxPrice": 400,
  "sellerType": "private",
  "includeDetails": true,
  "onlyNewAds": true,
  "stateKey": "ipad-alert"
}
```

### Output example

```json
{
  "id": "3539424745",
  "url": "https://www.kleinanzeigen.de/s-anzeige/apple-pencil-1-generation-vollstaendig-in-ovp-mit-zubehoer/3539424745-285-2601",
  "title": "Apple Pencil (1. Generation) – Vollständig in OVP mit Zubehör",
  "price": 45,
  "priceText": "45 € VB",
  "priceNegotiable": true,
  "postalCode": "26160",
  "state": "Niedersachsen",
  "city": "Bad Zwischenahn",
  "postedAt": "2026-10-12T22:38:00+02:00",
  "shippingAvailable": true,
  "shippingFrom": 0.99,
  "directBuy": true,
  "isProSeller": false,
  "sellerType": "private",
  "category": "Elektronik",
  "subcategory": "Tablets & Reader",
  "attributes": {"Art": "iPad", "Zustand": "Sehr Gut"},
  "description": "Hallo zusammen, ich verkaufe hier meinen Apple Pencil der 1. Generation ...",
  "images": ["https://img.kleinanzeigen.de/api/v1/prod-ads/images/57/5752a5d0-....?rule=$_59.JPG"],
  "imageCount": 5,
  "source": "kleinanzeigen.de",
  "scrapedAt": "2026-10-12T20:44:12Z"
}
```

### Fields you get

| Field | Description |
|---|---|
| `id`, `url`, `title`, `descriptionSnippet` | Ad ID, link, title and short text from the results page |
| `price`, `priceText`, `priceNegotiable`, `isFree` | Price as a number, as shown, VB flag, "Zu verschenken" |
| `postalCode`, `city`, `state` | Location (no street addresses) |
| `postedAt`, `postedLabel` | Posting time (ISO, Europe/Berlin) and the label shown on the site |
| `shippingAvailable`, `shippingFrom`, `directBuy` | Shipping possible, shipping price, "Direkt kaufen" |
| `isProSeller`, `shopName`, `sellerType` | Commercial seller flag, shop name (PRO only), private/commercial |
| `isTopAd`, `isWanted` | Paid top ad, "Gesuch" (wanted) ad |
| `imageUrl`, `imageCount`, `images` | Main photo, number of photos, all photos (details) |
| `category`, `subcategory`, `categoryId`, `attributes`, `description` | From the ad page when *Include full ad details* is on |

### FAQ

**Why only 5 pages per search?**
Kleinanzeigen's robots.txt lets automated visitors read the first 5 result pages and closes the price, sort, seller-type, shipping and radius filter URLs. The Actor respects that and applies those filters itself. Split big searches by city or category to get more ads.

**Is it legal to scrape Kleinanzeigen?**
The Actor reads only public pages without logging in and follows robots.txt. It does not collect private sellers' names, street addresses or contact details, and masks phone numbers and e-mails in descriptions by default. You are responsible for using the data in line with GDPR and the website's terms.

**Do I need a proxy?**
Usually not. If Kleinanzeigen starts blocking, the Actor switches to Apify Proxy automatically when it is enabled in the input.

**Something broke?**
Open an issue on the Issues tab. We usually reply within a day.

# Actor input Schema

## `keywords` (type: `array`):

What to search for across all of Germany, one search per line ("ipad", "rennrad", "ikea kallax").

## `searchUrls` (type: `array`):

Paste any Kleinanzeigen search from your browser to search a city or category, e.g. https://www.kleinanzeigen.de/s-berlin/ipad/k0l3331 or https://www.kleinanzeigen.de/s-fahrraeder/c217. URLs with the site's price, sort, seller-type, shipping or radius filters are skipped: use the filters below instead.

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

Maximum number of ads to save in this run. You only pay for ads saved to the dataset.

## `maxPagesPerSearch` (type: `integer`):

Kleinanzeigen allows reading the first 5 result pages (about 130 newest ads) of each search. Use more keywords or city/category URLs to cover more.

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

Open every ad to add the full description, attributes (condition, type, size...), all photos, shipping price, category and seller type. Billed as an extra event.

## `onlyNewAds` (type: `boolean`):

Remember the ads you already received and return only new ones. Schedule the Actor for instant deal alerts.

## `stateKey` (type: `string`):

Separate memory per alert: use a different key for each saved search.

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

Applied by the Actor. Ads without a price are skipped when set.

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

Applied by the Actor. Ads without a price are skipped when set.

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

Private sellers, commercial (PRO) sellers or both.

## `shippingOnly` (type: `boolean`):

Skip pickup-only ads.

## `excludeWanted` (type: `boolean`):

Skip ads where someone is looking to buy.

## `excludeTopAds` (type: `boolean`):

Skip promoted ads pinned to the top of results (often old dealer ads).

## `keepContactsInDescription` (type: `boolean`):

By default phone numbers and personal e-mails in descriptions are masked. Enable only with a lawful basis (GDPR). Seller names and street addresses are never collected.

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

Usually not needed. If Kleinanzeigen blocks the run, the Actor switches to Apify Proxy when it is enabled here.

## Actor input object example

```json
{
  "keywords": [
    "ipad"
  ],
  "maxItems": 30,
  "maxPagesPerSearch": 5,
  "includeDetails": false,
  "onlyNewAds": false,
  "stateKey": "default",
  "sellerType": "all",
  "shippingOnly": false,
  "excludeWanted": true,
  "excludeTopAds": false,
  "keepContactsInDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Scraped ads (table view).

## `adsFull` (type: `string`):

All fields including description and attributes.

# 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 = {
    "keywords": [
        "ipad"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("aidnurs/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 = {
    "keywords": ["ipad"],
    "maxItems": 30,
}

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

```

## MCP server setup

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