Kleinanzeigen Scraper (search, price & new-ad alerts, no login) avatar

Kleinanzeigen Scraper (search, price & new-ad alerts, no login)

Pricing

from $1.20 / 1,000 result items

Go to Apify Store
Kleinanzeigen Scraper (search, price & new-ad alerts, no login)

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

Viktor Dubnytskiy

Maintained by Community

Actor 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):

titlepriceLabelcitycategoryId
"FOCUS THRON² 6.8 EQP E-Fully nur 91 km 625 WH Top Zustand 3190€"3.190 € VBArnsberg217
"Urtopia E-Bike Riemenantrieb OVP"990 €Konstanz217
"Elektrofahrad"1.400 €Hamburg Heimfeld217

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

  1. Each query is searched at kleinanzeigen.de/s-<query>/k0 (optionally scoped by city and/or category) and paginated with /s-seite:<n>/... until maxListingsPerQuery is reached or the page comes back short.
  2. 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.
  3. includeDetails opens 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

FieldMeaningDefault
queriesSearch terms, e.g. fahrrad, sofa["fahrrad"]
location / locationIdCity slug + kleinanzeigen's numeric location id to scope every queryempty
categoryIdNumeric category id to scope every query, e.g. 217empty
minPrice / maxPricePrice bounds in EURempty
maxListingsPerQueryStop a query after roughly this many ads100
includeDetailsOpen each ad page for the full description and seller typefalse
strictQueryMatchStop a query if a whole page looks unrelated (rarely triggers, see Limits)true
maxItemsStop after this many rows total200
modescrape or monitor (only new/changed since last run)scrape
monitorStateId, webhookUrl, telegramBotToken, telegramChatIdMonitor-mode state key and alert targetsempty

Pricing

EventPrice
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; maxListingsPerQuery is 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 unless includeDetails opens 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).
  • strictQueryMatch is 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.