Kleinanzeigen Scraper (search, price & new-ad alerts, no login)
Pricing
from $1.20 / 1,000 result items
Kleinanzeigen Scraper (search, price & new-ad alerts, no login)
Search kleinanzeigen.de (Germany classifieds) by keyword, city and category. One row per ad: title, price, VB/free flag, zip and city, image, category, dealer or private, posted date. Monitor mode alerts on new ads and price drops for a saved search. No login.
Pricing
from $1.20 / 1,000 result items
Rating
0.0
(0)
Developer
Viktor Dubnytskiy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Search kleinanzeigen.de — Germany's largest classifieds site (ex-eBay Kleinanzeigen) — by keyword, city and category, and get one flat row per ad: title, price, location and posting date, with no login and no cookies.
What you get
Real rows from the example dataset (query fahrrad):
| title | priceLabel | city | categoryId |
|---|---|---|---|
| "FOCUS THRON² 6.8 EQP E-Fully nur 91 km 625 WH Top Zustand 3190€" | 3.190 € VB | Arnsberg | 217 |
| "Urtopia E-Bike Riemenantrieb OVP" | 990 € | Konstanz | 217 |
| "Elektrofahrad" | 1.400 € | Hamburg Heimfeld | 217 |
Full row: id, url, platform, country, title, description, price, currency, priceLabel, priceNegotiable, priceType, categoryId, categoryPath, condition, city, district, region, lat, lon, images, sellerId, sellerName, sellerType, createdAt, refreshedAt, validTo, isPromoted, deliveryAvailable, params, query, rank, source, zip, location, scrapedAt.
No seller names, phone numbers or e-mail addresses for private individuals are collected: search cards never show a private seller's name, and any phone/e-mail a private seller typed into their own ad text is scrubbed out (includeDetails mode, where the full text is read).
Use cases
- Watch a saved search (keyword + city) and get alerted the moment a new ad appears — the classic "be first to reply" use case for bikes, furniture, electronics.
- Track price drops on a category you're shopping in.
- Build a local price benchmark for an item type across German cities.
Try it in 10 seconds
Hit Start/Try it — the input already works: queries: ["fahrrad"], maxListingsPerQuery: 100, maxItems: 200, nothing required.
To get alerted on new ads and price drops for a saved search: save the task, set Mode to monitor, and put it on a schedule (Apify → Schedules → cron 0 * * * * hourly). Each run then returns only ads that are new or whose price changed since the previous check.
How it works
- Each query is searched at
kleinanzeigen.de/s-<query>/k0(optionally scoped by city and/or category) and paginated with/s-seite:<n>/...untilmaxListingsPerQueryis reached or the page comes back short. - A page past the real last one is not empty — the site redirects it back to page 1 and re-serves almost the same ads; the actor detects that repeat and stops instead of re-charging for the same ads or looping.
includeDetailsopens each ad's own page for the untruncated description and a confirmed private/dealer flag; text from a confirmed or likely-private seller has any phone number or e-mail address stripped before it is returned.
Input
| Field | Meaning | Default |
|---|---|---|
queries | Search terms, e.g. fahrrad, sofa | ["fahrrad"] |
location / locationId | City slug + kleinanzeigen's numeric location id to scope every query | empty |
categoryId | Numeric category id to scope every query, e.g. 217 | empty |
minPrice / maxPrice | Price bounds in EUR | empty |
maxListingsPerQuery | Stop a query after roughly this many ads | 100 |
includeDetails | Open each ad page for the full description and seller type | false |
strictQueryMatch | Stop a query if a whole page looks unrelated (rarely triggers, see Limits) | true |
maxItems | Stop after this many rows total | 200 |
mode | scrape or monitor (only new/changed since last run) | scrape |
monitorStateId, webhookUrl, telegramBotToken, telegramChatId | Monitor-mode state key and alert targets | empty |
Pricing
| Event | Price |
|---|---|
| result | $0.0015 per ad ($1.50 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.0015 per new/changed ad |
Charged only for ads actually pushed. A run that finds nothing pushes nothing and charges no result events.
Why this actor
- No login, no cookies, no account to keep alive.
- Price, VB (negotiable) and free-ad flags are parsed out of the card text, not guessed.
- Monitor mode fingerprints on price, so a saved search alerts on both brand-new ads and price changes on ads it already saw.
- Private-seller contact details are actively stripped, not just "not collected on purpose".
Limits
- kleinanzeigen.de shows ~27 ads per search page;
maxListingsPerQueryis rounded up to whole pages. - Seller type on the search card is only ever
commercial(a shop/dealer badge); a private seller's type is left unset unlessincludeDetailsopens the ad page, which prints "Privater Nutzer"/"Gewerblicher Nutzer" explicitly. - No category-path breadcrumb, no lat/lon, no listing attributes table (only what the search card and, with
includeDetails, the ad's own description carry). strictQueryMatchis a defensive no-op today: a nonsense-query fixture confirmed kleinanzeigen.de answers with a genuine "no results" page, not filler.
FAQ
Does it need a kleinanzeigen.de login? No. Every request is made as a logged-out visitor.
What happens when a search has no ads? No rows are pushed and no result events are charged. The RUN_SUMMARY record in the run's key-value store carries emptyReason.
Does it collect seller names or phone numbers? No private-seller name is ever returned — the search card shows none, and sellerName is only populated for a shop/dealer badge. Any phone number or e-mail a private seller wrote into their own ad text is stripped out.
Changelog
- 0.1: initial release — keyword/city/category search, price & VB/free parsing, monitor mode, ad-detail enrichment with private-seller contact scrubbing.
If this actor saved you time, a short review on its Store page genuinely helps other people find it. Found a bug or need a field that is missing? Open a ticket on the Issues tab.