# 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kleinanzeigen Monitor: New Listing & Price Drop Alerts",
        "description": "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.",
        "version": "0.1",
        "x-build-id": "o0QfUK8fyd6usm7QH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bostomate~kleinanzeigen-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bostomate-kleinanzeigen-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/bostomate~kleinanzeigen-monitor/runs": {
            "post": {
                "operationId": "runs-sync-bostomate-kleinanzeigen-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/bostomate~kleinanzeigen-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-bostomate-kleinanzeigen-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Search queries to monitor",
                        "type": "array",
                        "description": "One or more search terms. Each is monitored independently — you get an alert only for listings not seen in previous runs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceFromEur": {
                        "title": "Min price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only listings at or above this price."
                    },
                    "priceToEur": {
                        "title": "Max price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only listings at or below this price."
                    },
                    "sellerType": {
                        "title": "Seller type",
                        "enum": [
                            "any",
                            "private",
                            "commercial"
                        ],
                        "type": "string",
                        "description": "Monitor only private sellers (best for deal hunting), only commercial sellers, or both.",
                        "default": "any"
                    },
                    "locationId": {
                        "title": "Location ID (optional)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "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": {
                        "title": "Radius (km)",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Only listings within this distance of the location. Requires Location ID. 0 = the location itself."
                    },
                    "pagesPerQuery": {
                        "title": "Pages checked per query",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "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.",
                        "default": 1
                    },
                    "includeCommercialListings": {
                        "title": "Include sponsored / top ads",
                        "type": "boolean",
                        "description": "Sponsored and TOP-ad placements are filtered out by default (they repeat on every page and flood alerts). Turn on to include them.",
                        "default": false
                    },
                    "emitOnFirstRun": {
                        "title": "Emit results on the first run",
                        "type": "boolean",
                        "description": "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.",
                        "default": true
                    },
                    "monitorId": {
                        "title": "Monitor ID",
                        "type": "string",
                        "description": "Name of this watchlist's memory. Use different IDs to run independent monitors (e.g. one per product) without their seen-histories mixing.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. The monitor is polite by design (5s between page fetches); add a proxy only if your runs get blocked."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
