# Kleinanzeigen Scraper & API - Listings, Prices & Price Drops (`surefeed/kleinanzeigen-scraper`) Actor

Get Kleinanzeigen.de listings for any search, past the 1,250-results limit: price, negotiable (VB), price drops, location, date, shipping, seller type, photos - and optionally full description, attributes and view count. Only new listings mode.

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

## Pricing

from $0.40 / 1,000 listings

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 & API - Listings, Prices & Price Drops

Get **Kleinanzeigen.de listings for any search** — also past Kleinanzeigen's 50-pages limit: price, **VB (negotiable)**, **price drops** with the old price, postcode and district, posting date and time, shipping, PRO sellers — and optionally the full description, attributes (brand, model, condition…), category, all photos and seller type. As a spreadsheet, JSON or a live API.

> ⭐ **Found this Actor useful?** [Leave a review](https://apify.com/surefeed/kleinanzeigen-scraper/reviews) — it takes 30 seconds and helps other people find it.
>
> 🛠️ **Something not working?** [Open an issue](https://apify.com/surefeed/kleinanzeigen-scraper/issues) with the run link and we'll fix it within 24–48 hours.

**What you get for each listing**

- 💶 **Price**, **VB / negotiable**, **price drop** (the crossed-out old price), free listings ("Zu verschenken")
- 📍 Postcode and district, **posting date and time** (German time), shipping possible, PRO seller and shop name, photo count
- 📝 With details: **full description**, **attributes** (brand, model, condition, size…), category path, all photos, shipping options ("+ Versand ab 2,99 €"), **private or commercial seller** and "active since"
- 🔔 **Only new listings and price changes**: schedule it and get only what's new — or got cheaper — since your last run

**Quick start:** click **Start** without changing anything to get the 100 newest "iphone" listings in Germany (about $0.06). Then type your search terms and a location, or paste any search link from kleinanzeigen.de. No login needed — you pay only per listing returned.

Real results — bikes in Berlin (+10 km), 100–300 €, October 2026, as shown on kleinanzeigen.de:

| Listing | Price | Old price | Postcode | Posted | Shipping | Condition |
|---|---|---|---|---|---|---|
| Author Profile Mountainbike silber 26 Zoll | 125 € | 170 € | 10711 Charlottenburg | Oct 10 | + Versand ab 0,99 € | Sehr Gut |
| Rennrad Stadler One Series 1.2 | 220 € VB | — | 12043 Neukölln | Oct 11, 02:34 | Nur Abholung | In Ordnung |
| Riverside 500 C6 L Fahrrad / Hybrid Bike | 250 € | — | 10115 Mitte | Oct 11, 03:14 | Nur Abholung | Sehr Gut |

#### Why this Kleinanzeigen scraper?

| Typical Kleinanzeigen scrapers | This Actor |
|---|---|
| Unverified data | **Checked against the live site: 200 of 200 fields identical** on 20 listings (title, price, VB, postcode, district, shipping, seller type, active since, category, description) |
| Stop at 1,250 listings: Kleinanzeigen shows at most 50 pages per search | **Every priced listing**: big searches are split into price bands and merged without duplicates — bikes in Berlin (+10 km): **23,644 of the 24,251** listings the site reported (97.5%; listings without a price can't be split by price) |
| Break when Kleinanzeigen changes its pages | **Reads both listing-page layouts** Kleinanzeigen currently serves (the classic one and the new one being rolled out) |
| Only the current price | **Price drops**: the old, crossed-out price and `priceDropped` |
| Re-download everything | **Only new listings and price changes** since your last run |
| Seller names and phone numbers of private people | **Privacy-safe**: no private seller names, no phone numbers — business names only for commercial sellers |
| Inflate view counters to read them | **Never touches the ad's view counter** (reading it would count a fake visit for the seller) |

#### Use cases

- **Deal hunters and resellers**: new listings and price drops for any search, every hour.
- **AI agents**: "find a used road bike under 500 € within 20 km of Munich, posted today" — one call.
- **Price research**: real asking prices by model, condition and region — for cars, electronics, furniture, rentals.
- **Dealers**: see what competitors list, at which prices, and how often they cut them.
- **Market monitoring**: supply and price trends in any category, city by city.

#### How to use

1. Enter **Search terms** (e.g. `iphone 15`, `rennrad`) and optionally a **Location** (city or postcode) and **Radius (km)** — or paste **Search links** from kleinanzeigen.de with any category and filters.
2. Optional: **Min / Max price**, **Seller** (private / commercial), **Newest first**.
3. Set **Max listings per search** (0 = every listing) and turn on **Include listing details** if you need descriptions and attributes.
4. Click **Start** and download the results as JSON, CSV or Excel, or fetch them via API.

#### Input

```json
{
    "searchTerms": ["rennrad"],
    "location": "München",
    "radiusKm": 20,
    "minPrice": 200,
    "maxPrice": 800,
    "sellerType": "private",
    "sortNewest": true,
    "maxListingsPerSearch": 0,
    "includeDetails": true,
    "onlyNewListings": false
}
```

#### Output

One item per listing (real example with **Include listing details** on; description and photo links shortened):

```json
{
    "adId": "3537089111",
    "title": "Author Profile Mountainbike silber 26 Zoll",
    "url": "https://www.kleinanzeigen.de/s-anzeige/author-profile-mountainbike-silber-26-zoll/3537089111-217-3344",
    "price": 125,
    "priceText": "125 €",
    "negotiable": false,
    "oldPrice": 170,
    "priceDropped": true,
    "zip": "10711",
    "location": "Charlottenburg",
    "postedDate": "2026-10-10",
    "postedTime": "21:52",
    "promoted": false,
    "shipping": true,
    "sellerIsPro": false,
    "imageCount": 3,
    "description": "Ich verkaufe mein Mountainbike, da ich auf ein anderes Rad umgestiegen bin. Es…",
    "attributes": {
        "Art": "Herren",
        "Typ": "Mountainbikes",
        "Zustand": "Sehr Gut"
    },
    "category": "Fahrräder & Zubehör",
    "categoryPath": [
        "Auto, Rad & Boot",
        "Fahrräder & Zubehör"
    ],
    "priceType": "FIXED",
    "shippingText": "+ Versand ab 0,99 €",
    "sellerType": "private",
    "sellerActiveSince": "2026-05-25",
    "images": [
        "https://img.kleinanzeigen.de/api/v1/prod-ads/images/cc/cc2c41a3-a6bc-4220-9091-ada969a946cb…",
        "https://img.kleinanzeigen.de/api/v1/prod-ads/images/92/925e4031-85f9-4bba-b334-1377f2daa5ad…"
    ],
    "scrapedAt": "2026-10-11T01:20:39.611Z"
}
```

| Field | Meaning |
|---|---|
| `price` / `priceText` | Asking price in euros as a number, and as shown ("899 € VB"); `null` when only "VB" is given |
| `negotiable` | "VB" (Verhandlungsbasis) |
| `oldPrice` / `priceDropped` | The crossed-out previous price when the seller lowered it |
| `postedDate` / `postedTime` | When the listing was posted, German time ("Heute, 02:52" becomes today's date) |
| `promoted` | A promoted listing (shown without a date) |
| `changedSinceLastRun` | With **Only new listings**: `true` when you got this listing before at another price |
| `attributes` | With details: the listing's attribute list, e.g. `{"Marke": "Apple", "Zustand": "Sehr Gut"}` |
| `sellerType` / `sellerActiveSince` | With details: `private` or `commercial`, and since when the account exists |

#### How much does it cost?

**Pay per event** — no monthly rental, no start fee, no proxy or compute surcharge:

- **Listing** — each listing returned: **$0.60 per 1,000**.
- **Listing details** — description, attributes, photos and seller info for a listing (only with **Include listing details**): **$2.00 per 1,000** more.

Examples: 100 listings ≈ $0.06; 1,000 listings with details ≈ $2.60. Set **Max cost per run** for a hard cap on spending.

#### Automate & integrate

Schedule a run every hour with **Only new listings and price changes** on, trigger webhooks, or send results to Google Sheets, Slack, Make, Zapier or n8n. Call it from any language through the Apify API.

#### Use with AI assistants (MCP)

Add this Actor as a tool to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server (`https://mcp.apify.com`). Your assistant can then search Kleinanzeigen on demand.

#### Agent-ready: autonomous payments (x402 & Skyfire)

AI agents can discover, run and pay for this Actor on their own — no Apify account or API key needed — using x402 (USDC on Base) or Skyfire.

#### FAQ

**How do you get past the 50-pages limit?**
Kleinanzeigen shows at most 50 pages (1,250 listings) per search. When a search has more, the Actor repeats it in price bands (halving any band that is still too big) and merges the results without duplicates. Listings without a price (only "VB") can't be found by price, so past the first 1,250 only priced listings are included.

**How accurate is the data?**
We compared 20 listings (bikes in Berlin) with their pages on kleinanzeigen.de in a browser (October 2026): title, price, VB, postcode, district, shipping, seller type, active since, category and description — 200 of 200 values identical — and every attribute (brand, type, condition…) on all 20, on both page layouts Kleinanzeigen serves. Price drops matched the crossed-out price on the site.

**Why is the posting date sometimes one day later than on the listing page?**
For listings posted just after midnight, Kleinanzeigen's listing page shows the previous day (it uses UTC), while the search shows "Heute". We use German local time.

**Can I get the seller's name or phone number?**
No. Private sellers' names and phone numbers are personal data, so they're left out; for commercial sellers you get the business name.

**Is it legal to scrape Kleinanzeigen?**
The Actor only reads public listings, the same data anyone sees on kleinanzeigen.de, without logging in. Check Kleinanzeigen's terms and your local laws (including GDPR) for your use case.

**Something is broken — what now?**
Open an issue on the **Issues** tab with the run link. We usually fix problems within 24–48 hours.

#### More tools from us

- [Eventbrite Scraper & API](https://apify.com/surefeed/eventbrite-scraper) — every event in any city or online, with ticket prices, sold out and organizer details.
- [Workday Jobs Scraper & API](https://apify.com/surefeed/workday-jobs-scraper) — every job from any Workday careers site, with exact posting date, salary range and remote status.
- [Google Hotels Scraper & API](https://apify.com/surefeed/google-hotels-scraper) — hotel prices with taxes, every booking site's offer, and hotels near any address.
- [Google Flights Scraper & API](https://apify.com/surefeed/google-flights-scraper) — fares, stops, layovers and CO2 emissions for any route, flexible dates.
- [Google Trends Scraper & API](https://apify.com/surefeed/google-trends-scraper) — interest over time, by region, related queries and trending searches.
- [Google Play Scraper & API](https://apify.com/surefeed/google-play-scraper) — Android app data, star histograms and reviews.
- [App Store Scraper & API](https://apify.com/surefeed/app-store-scraper) — iPhone app data, star histograms, top charts and reviews in 150+ countries.

#### Legal

**Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Kleinanzeigen GmbH or eBay. It only collects publicly available listings. All trademarks belong to their respective owners.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search, one per line (e.g. iphone 15, rennrad, kinderwagen). Combined with Location, Radius and the filters below.

## `location` (type: `string`):

Optional: a city, district or 5-digit postcode (e.g. Berlin, München, 10115). Empty = all of Germany.

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

Optional: around the location, e.g. 10, 20, 50, 100. 0 = the location only.

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

Optional: any search from kleinanzeigen.de, with its category and filters, e.g. https://www.kleinanzeigen.de/s-fahrraeder/berlin/c217l3331. Price, seller and sorting below are added to it.

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

Optional: only listings from this price.

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

Optional: only listings up to this price.

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

All sellers, only private sellers or only commercial sellers (dealers, shops).

## `sortNewest` (type: `boolean`):

Sort by newest listing (best for monitoring). Off = Kleinanzeigen's own order.

## `maxListingsPerSearch` (type: `integer`):

Stop after this many listings for each search. 0 = every listing, also past Kleinanzeigen's 50-pages limit (1,250 listings).

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

Open each listing for its full description, attributes (brand, model, condition…), category, all photos, shipping options and seller type / active since. Slower and charged as an extra event.

## `onlyNewListings` (type: `boolean`):

Return only listings that your previous runs of the same search did not return — or whose price changed since (field changedSinceLastRun). Ideal for a schedule: you pay only for what's new.

## Actor input object example

```json
{
  "searchTerms": [
    "iphone"
  ],
  "radiusKm": 0,
  "sellerType": "any",
  "sortNewest": true,
  "maxListingsPerSearch": 100,
  "includeDetails": false,
  "onlyNewListings": false
}
```

# Actor output Schema

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

Items produced by the run.

## `runSummary` (type: `string`):

Duration, charged events and whether the spending limit was reached.

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

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

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

```

## MCP server setup

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