# Kleinanzeigen Scraper – Germany Classifieds & Prices (`ninhothedev/kleinanzeigen-scraper`) Actor

$1.5/1K 🔥 #1 Kleinanzeigen scraper for Germany 🇩🇪! Scrape any category — title, price, location, seller, images & description. JSON, CSV, Excel or API in seconds. Just paste a search URL & extract thousands of ads instantly. Fast, cheap & reliable ⚡

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

## Pricing

from $1.49 / 1,000 listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Classifieds & Prices

**Scrape any Kleinanzeigen.de search into clean, structured data.** This Kleinanzeigen scraper (formerly eBay Kleinanzeigen) turns Germany's #1 classifieds platform into JSON, CSV or Excel — title, price, negotiability, location, seller type, shipping, images, and full listing details on demand.

Paste any search URL, get the **richest structured output** on the market — at **$1.49 per 1,000 listings**, at the low end of the market.

***

> ## ⚠️ Read this first: use a SEARCH URL, not a single listing
>
> Paste a **search‑results** URL — open [kleinanzeigen.de](https://www.kleinanzeigen.de), type your keyword, set your filters, then copy the URL from the address bar:
>
> ✅ **Correct:** `https://www.kleinanzeigen.de/s-rolex-gmt-master/k0`
> ❌ **Wrong:** `https://www.kleinanzeigen.de/s-anzeige/rolex-.../3442016963-157-1001`
>
> The wrong one is a **single ad page** (`/s-anzeige/…`), not a search. If you paste that, the actor **stops immediately with a clear error** instead of returning unrelated listings — so you can't get garbage results by accident. Fix the URL and re‑run.

***

### How to get your search URL (30 seconds)

1. Open **[kleinanzeigen.de](https://www.kleinanzeigen.de)**.
2. Type your keyword into the **search bar** (e.g. `iPhone 13 128GB`) and press **Enter**. You're now on a **results page**.
3. *(Optional)* narrow it with the filters on that page — **category**, **location + radius**, **price range (Preis von–bis)**, **„Nur Privat"**. Every filter you set is baked into the URL.
4. Copy the **whole URL from your browser's address bar**.
5. Paste it into the **`searchUrls`** field. Add as many as you like.

**Example:** `https://www.kleinanzeigen.de/s-handy-telefon/iphone-13/k0c173`

***

### Why use it

- 🏆 **Richest output on the market** — every field a listing exposes: price, negotiability, location + ZIP, posting date, seller type, shipping, images — plus full description, **all** photos and the seller profile with `fetchDetails`.
- 🧹 **Clean, relevant results** — automatically drops Kleinanzeigen's loosely‑related "ähnliche Anzeigen" padding, so a niche search stays on‑topic (no random junk).
- 🛡️ **Reliable & hard to block** — Chrome TLS‑fingerprint requests + Apify proxies + a stealth‑browser fallback. If the site layout changes, the run **fails loudly** instead of silently returning 0 results.
- ⚡ **Fast** — detail pages are fetched concurrently (≈3–4× faster than serial), so even large searches with `fetchDetails` stay quick.
- 💸 **Cheap & transparent** — **$1.49 / 1,000 listings**, pay‑per‑result. You only pay for listings actually returned. No subscriptions, no surprises.
- 📤 **Export anywhere** — JSON, CSV, Excel, XML or the dataset API. Plug into Sheets, Make, Zapier, n8n.
- 🔁 **Many searches at once** — paste multiple search URLs; each is scraped and paginated automatically.
- 🔒 **GDPR‑conscious** — listing data only; it never extracts phone numbers or e‑mail addresses.

***

### What you get

**Per listing (always):**

`id` · `title` · `price` · `currency` · `isVB` (negotiable) · `priceType` (fixed / negotiable / free) · `url` · `imageUrl` · `imageCount` · `location` · `zipCode` · `postedAt` · `listingAgeHours` · `sellerType` (private / commercial) · `sellerName` · `shippingAvailable` · `isTopAd` · `searchUrl` · `scrapedAt`

**With `fetchDetails: true` (richest output):**

`description` (full text) · `allImages[]` (every photo) · `sellerActiveSince` · `sellerListingCount`

> **No personal contact data.** Phone numbers and e‑mail addresses are never extracted (GDPR).

***

### Example output

```json
{
  "id": "3433663986",
  "title": "iPhone 13 128 GB",
  "price": 249,
  "currency": "EUR",
  "isVB": false,
  "priceType": "fixed",
  "url": "https://www.kleinanzeigen.de/s-anzeige/iphone-13-128-gb/3433663986-173-4896",
  "imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/...",
  "imageCount": 9,
  "location": "Darmstadt",
  "zipCode": "64297",
  "postedAt": "2026-06-12T08:15:00Z",
  "listingAgeHours": 3.1,
  "sellerType": "private",
  "shippingAvailable": true,
  "description": "Ich verkaufe mein altes iPhone … Akku 80 % …",
  "allImages": ["https://img.kleinanzeigen.de/...", "..."],
  "sellerActiveSince": "23.04.2022",
  "sellerListingCount": 2
}
```

***

### How to use

1. Open [kleinanzeigen.de](https://www.kleinanzeigen.de), set your keyword, category, location, radius and price filters.
2. Copy the URL from your browser's address bar.
3. Paste it into `searchUrls` (add as many as you like).
4. Toggle `fetchDetails` if you want full descriptions, all photos and seller profiles.
5. Run. Export the dataset as JSON, CSV, Excel or via the API.

***

### Settings — everything you can configure

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchUrls` | array | iPhone example | One or more Kleinanzeigen **search‑results** URLs (filters baked into the URL). Each is scraped and paginated automatically. |
| `fetchDetails` | boolean | `false` | Also load each listing's **detail page** for the full description, **all** images and the seller profile (active‑since, listing count). |
| `detailConcurrency` | integer | `8` | How many detail pages to fetch **in parallel** when `fetchDetails` is on. |
| `privateOnly` | boolean | `false` | Keep only **private** sellers (drop commercial / PRO). |
| `maxItemsPerSearch` | integer | `200` | **Cap** the listings scraped per search URL (controls cost & runtime). |
| `proxyConfiguration` | object | Apify Datacenter | Standard Apify proxy input. Datacenter is enough for most searches. |

#### How to tune the main settings

- **`fetchDetails`:** leave **off** for a quick price/location scan (fastest, cheapest — you still get 20 fields per listing). Turn **on** when you need full descriptions, every photo and the seller profile. It fetches detail pages concurrently, so it stays fast.
- **`detailConcurrency`:** `8` is a good balance. Raise it (e.g. `12–16`) for speed on big runs; **lower it to `3–4` if you start hitting blocks**.
- **`maxItemsPerSearch`:** set this to control spend — e.g. `50` for a quick sample, `1000`+ to sweep a whole category. You only pay for listings actually returned.
- **`privateOnly`:** turn **on** to drop dealers/PRO shops and keep only private sellers.
- **`proxyConfiguration`:** the default Apify **Datacenter** proxy handles most searches. Switch to **Residential** only if you see blocks on very large runs.

***

### Pricing

**$1.49 per 1,000 listings** (pay per result) — at the low end of the market, with richer output than the cheaper alternatives. You only pay for listings actually returned.

***

### Looking for deals, not just data?

If you're a **reseller or flipper** and want to be alerted the moment an underpriced listing appears, check out the sister actor **Kleinanzeigen Deal Finder & Price Monitor** — it adds new‑listing monitoring and a deal score against the market median on top of this scraper's data.

***

### FAQ

**Does it need proxies?** Apify Datacenter proxy (the default) is enough for most searches. Use Residential only if you hit blocks.

**How many listings per search?** As many as the search has, up to `maxItemsPerSearch`. The actor paginates automatically.

**Which categories work?** Any — electronics, furniture, cars & parts, services, real estate. The scraper is category‑agnostic; just give it a search URL.

**What formats can I export?** JSON, CSV, Excel, XML, or pull from the dataset API.

***

### Legal & privacy

This actor collects only **publicly available listing data** and never extracts phone numbers or e‑mail addresses. You are responsible for complying with Kleinanzeigen's Terms of Service and applicable data‑protection law (incl. GDPR) for your use case.

***

**Keywords:** kleinanzeigen scraper, ebay kleinanzeigen, germany classifieds, marketplace data, price scraper, listings export, JSON CSV Excel.

# Actor input Schema

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

One or more Kleinanzeigen.de SEARCH-RESULTS or category URLs (with all filters applied in the URL). Open kleinanzeigen.de, type your keyword, set filters, then copy the URL from the address bar — e.g. https://www.kleinanzeigen.de/s-rolex-gmt-master/k0. ⚠️ Do NOT paste a single listing page (a /s-anzeige/... URL) — that is one ad, not a search, and will be rejected.

## `fetchDetails` (type: `boolean`):

Load each listing's detail page for the full description, all images, and seller profile (active since, listing count). Slower but gives the richest output.

## `privateOnly` (type: `boolean`):

Exclude commercial / PRO sellers and keep only private listings.

## `maxItemsPerSearch` (type: `integer`):

Maximum number of listings to scrape per search URL (across pages).

## `detailConcurrency` (type: `integer`):

How many detail pages to fetch in parallel when 'Fetch full listing details' is on. Higher = faster, but be polite — 8 is a good balance. Lower it if you hit blocks.

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

Proxy settings. Apify Datacenter proxy is enough for most searches; switch to Residential if you hit blocks.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.kleinanzeigen.de/s-handy-telefon/iphone-13/k0c173"
  ],
  "fetchDetails": false,
  "privateOnly": false,
  "maxItemsPerSearch": 200,
  "detailConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `listings` (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 = {
    "searchUrls": [
        "https://www.kleinanzeigen.de/s-handy-telefon/iphone-13/k0c173"
    ],
    "maxItemsPerSearch": 200,
    "detailConcurrency": 8,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/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 = {
    "searchUrls": ["https://www.kleinanzeigen.de/s-handy-telefon/iphone-13/k0c173"],
    "maxItemsPerSearch": 200,
    "detailConcurrency": 8,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/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 '{
  "searchUrls": [
    "https://www.kleinanzeigen.de/s-handy-telefon/iphone-13/k0c173"
  ],
  "maxItemsPerSearch": 200,
  "detailConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call ninhothedev/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/B7Vuj3BnxfRPEfu6M/builds/1EV7hErDcep4U9hKm/openapi.json
