# Kleinanzeigen Monitor: New Listing & Price Drop Alerts (`bostomate/kleinanzeigen-monitor`) Actor

Monitor Kleinanzeigen.de searches and get only NEW listings and PRICE DROPS: no duplicates, no sponsored ads, no daily-digest lag. Built for resellers and deal hunters in Germany.

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

## Pricing

from $7.00 / 1,000 new 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 Monitor — New Listing & Price Drop Alerts

### What is Kleinanzeigen Monitor?

Kleinanzeigen Monitor watches your searches on **Kleinanzeigen.de** — Germany's largest classifieds site with 55+ million live ads — and returns **only what changed**: brand-new listings and price drops. No duplicates, no sponsored ads, no re-reading the same results every run.

Kleinanzeigen's own saved-search notifications are slow and easy to miss — by the time you check them, the good deals are gone. Resellers and deal hunters win by being first. Run this monitor on an Apify Schedule every 10–60 minutes and each run delivers just the delta: a listing you haven't seen before, or a seller cutting their price.

Unlike one-shot Kleinanzeigen scrapers, this is a **stateful monitor**: it remembers what it has seen per query (in a key-value store on your Apify account) and stays quiet when nothing changed. The first run returns the current matching listings (so you see what's out there and start from a known set); from then on you get only what's new or cheaper. Prefer a silent baseline and deltas only? Set `emitOnFirstRun` to false.

### What can you do with it?

- **Be first on underpriced items**: watch "iphone 15 pro", "playstation 5", "e-bike bosch" and buy before other flippers even open the app.
- **Price-drop sniping**: sellers who cut their price want to sell *now* — the monitor flags every drop with the old price and drop percentage. It even catches Kleinanzeigen's own strike-through price cuts (`oldPriceEur`).
- **Private sellers only**: filter to `sellerType: private` to skip shops and dealers — that's where the underpriced listings live.
- **Local hunting**: restrict to a city + radius (e.g. Berlin + 10 km) for pickup-only categories like furniture or appliances.
- **Feed your own automations**: connect the dataset to Telegram, Slack, e-mail or webhooks with Apify integrations, or poll it from your own code.

### How to use it

1. Enter one or more **queries** (each is monitored independently).
2. Optional filters: price band, seller type, location + radius.
3. Run once — you get the current matches and the monitor starts remembering.
4. Create an **Apify Schedule** (e.g. every 15 minutes) for the actor. Every scheduled run now emits only new listings and price drops.
5. Optionally add an Apify **integration** (webhook/Slack/email) on new dataset items.

Example input:

```json
{
    "queries": ["lego technic 42115", "makita akkuschrauber"],
    "priceToEur": 300,
    "sellerType": "private",
    "locationId": 3331,
    "radiusKm": 50
}
```

`locationId` is Kleinanzeigen's numeric region id: search your city on kleinanzeigen.de and copy the number after `l` at the end of the URL (Berlin = 3331).

### Output

One dataset item per alert:

```json
{
    "alertType": "price_drop",
    "query": "lego technic 42115",
    "adId": "3451871935",
    "title": "LEGO Technic 42054 Claas Xperion 5000 Traktor mit OVP - TOP!",
    "priceEur": 150,
    "previousPrice": 160,
    "priceDropPercent": 6.3,
    "priceLabel": "VB",
    "zip": "22525",
    "city": "Hamburg Stellingen",
    "postedLabel": "Heute, 21:14",
    "listingUrl": "https://www.kleinanzeigen.de/s-anzeige/lego-technic-42054-...",
    "imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/...",
    "firstSeen": "2026-07-05T14:12:03Z"
}
```

`alertType` is `new` or `price_drop`. `priceLabel` is `VB` for negotiable prices ("Verhandlungsbasis") or `Zu verschenken` for free items. Sponsored/TOP placements are filtered out by default (`includeCommercialListings` turns them back on).

### Pricing

You pay **per alert**, not per run or per page: a quiet run with zero changes costs you nothing in events. Monitoring 5 queries every 15 minutes typically produces a handful of alerts per day — cents per week, cheaper than any commercial Kleinanzeigen alert service (which charge $50+/month for the same thing).

### FAQ

**What does the first run return?** The current matching listings for each query, so you see the market immediately and the monitor has a baseline to compare against. Every run after that returns only new listings and price drops. If you want a silent baseline (alerts only for listings that appear *after* the first run), set `emitOnFirstRun` to false.

**How fast are alerts?** As fast as your Schedule. Every 10–15 minutes is a good balance; the monitor checks the newest listings per query each run.

**How many listings does it check per run?** `pagesPerQuery` × 25 newest listings per query (default 1 page). For very busy queries or slow schedules, raise it up to 5 pages.

**Does it get blocked?** The monitor is deliberately polite (5-second spacing between page fetches, automatic back-off). For heavy watchlists on tight schedules, add a proxy in the input.

**Can I run multiple watchlists?** Yes — give each its own `monitorId`. Each keeps an independent seen-history.

**Is this legal?** The monitor reads only publicly visible listings — no login, no personal data beyond what any visitor sees on the search page.

**What about Marktplaats / 2dehands?** Same product, different country: our [Marktplaats Monitor](https://apify.com/bostomate/marktplaats-monitor) does exactly this for the Netherlands and Belgium. For used cars there's the [AutoScout24 Price Monitor](https://apify.com/bostomate/autoscout-price-monitor), and for industrial auctions the [European Auction Scraper](https://apify.com/bostomate/european-auction-scraper).

### Disclaimer

This is an independent tool, not affiliated with or endorsed by Kleinanzeigen or Adevinta. All trademarks belong to their owners. The actor reads only publicly accessible listing data, respects a polite request rate, and stores no personal data beyond the public listing fields you receive.

# Actor input Schema

## `queries` (type: `array`):

One or more search terms. Each is monitored independently — you get an alert only for listings not seen in previous runs.

## `priceFromEur` (type: `integer`):

Only listings at or above this price.

## `priceToEur` (type: `integer`):

Only listings at or below this price.

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

Monitor only private sellers (best for deal hunting), only commercial sellers, or both.

## `locationId` (type: `integer`):

Limit to a city/region. Kleinanzeigen uses numeric location ids: search your city on kleinanzeigen.de and copy the number after 'l' at the end of the URL (e.g. Berlin = 3331).

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

Only listings within this distance of the location. Requires Location ID. 0 = the location itself.

## `pagesPerQuery` (type: `integer`):

How many result pages (25 listings each, newest first) to check per query per run. 1 page covers a typical query polled every 15-60 minutes; raise it for very busy queries or slow schedules.

## `includeCommercialListings` (type: `boolean`):

Sponsored and TOP-ad placements are filtered out by default (they repeat on every page and flood alerts). Turn on to include them.

## `emitOnFirstRun` (type: `boolean`):

On the first run of a new query, return the current matching listings (so you immediately see what's out there and start monitoring from a known set). Turn this OFF if you want a silent baseline and alerts only for listings that appear AFTER the first run.

## `monitorId` (type: `string`):

Name of this watchlist's memory. Use different IDs to run independent monitors (e.g. one per product) without their seen-histories mixing.

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

Optional. The monitor is polite by design (5s between page fetches); add a proxy only if your runs get blocked.

## Actor input object example

```json
{
  "queries": [
    "lego technic"
  ],
  "sellerType": "any",
  "pagesPerQuery": 1,
  "includeCommercialListings": false,
  "emitOnFirstRun": true,
  "monitorId": "default"
}
```

# 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 = {
    "queries": [
        "lego technic"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bostomate/kleinanzeigen-monitor").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 = { "queries": ["lego technic"] }

# Run the Actor and wait for it to finish
run = client.actor("bostomate/kleinanzeigen-monitor").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 '{
  "queries": [
    "lego technic"
  ]
}' |
apify call bostomate/kleinanzeigen-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/bmlNSkBRka8e4aLHQ/builds/o0QfUK8fyd6usm7QH/openapi.json
