Kleinanzeigen.de Scraper — German Classifieds Search avatar

Kleinanzeigen.de Scraper — German Classifieds Search

Pricing

from $1.40 / 1,000 result items

Go to Apify Store
Kleinanzeigen.de Scraper — German Classifieds Search

Kleinanzeigen.de Scraper — German Classifieds Search

Kleinanzeigen.de (ex eBay Kleinanzeigen) scraper for resellers, dealers and AI agents: search by keyword, 159 categories, 48 German cities with radius, price, private/commercial, offers vs wanted ads, shipping.

Pricing

from $1.40 / 1,000 result items

Rating

0.0

(0)

Developer

Samat Makatov

Samat Makatov

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Share

Search results from kleinanzeigen.de (formerly eBay Kleinanzeigen), Germany's largest classifieds site. Filter by keyword, any of 159 categories, 48 big cities with radius, price range, private or commercial sellers, offers or wanted ads, shipping, and category attributes. Each ad comes with price type (fixed / VB / free), old price, postcode, posting time, shipping and "Direkt kaufen" flags, and the shop name for commercial sellers. detail: true adds the full description, category attributes, coordinates, seller name, seller type, "active since" and all photos.

No proxies, no browser, no API key.

Use cases

  • Reseller sourcing: "iphone 15" in handy-telekom, private sellers, below your buy price, sinceHours: 2 on an hourly schedule, so you see deals first.
  • Price research for pricing a product: pull a few hundred ads for a model and take the median price of priceType: "fixed" ads.
  • Buyer-intent lead generation: adType: "wanted" lists people looking for a product or service in your city (e.g. "Nachhilfe", "Wohnung", "Transporter").
  • Dealer & competitor monitoring: sellerType: "commercial" shows which shops sell what, at what price (shopName, shopUrl).
  • Local market scans: category: "wohnung-mieten" + location: "Leipzig" + radiusKm: 10 gives private rental offers for rental-market analysis.
  • Brand protection / counterfeit checks: brand keyword + shippingOnly, with detail pages for seller names and active-since dates.

Input

At least a query or a category is required. All other fields are optional.

FieldTypeDefaultAllowed values / notes
querystring– (prefill fahrrad)Keywords. Can be empty when category is set.
categorystring– (all)Category id (216), code (c216), slug (autos) or German name (Handy & Telefon; umlauts optional). Empty or k0 = all. See Reference.
locationstring–City from Reference → Cities, written in full (umlauts optional: Muenchen). Empty = all Germany.
locationSlug + locationIdstring–Any other place, taken from a kleinanzeigen URL (/s-bad-toelz/…/k0l7536 → bad-toelz, l7536). v0.1 inputs.
radiusKminteger–5, 10, 20, 30, 50, 100, 150, 200 (needs a location)
priceFrom / priceTointeger–€
sellerTypestringallall, private, commercial
adTypestringofferoffer (Angebote), wanted (Gesuche), all
shippingOnlybooleanfalseOnly "Versand möglich"
attributesobject{}Category attributes from a URL after +, e.g. {"fahrraeder.type_s": "ebike"}, {"autos.marke_s": "bmw"}, {"global.zustand": "like_new"}
sortstringnewestnewest (sent to the site explicitly — without it cars and real estate come in "Empfohlen" order), price_asc, distance
sinceHoursinteger–Only ads posted in the last N hours
includeTopAdsbooleanfalseKeep the paid top ads pinned above the results (they ignore the sort order and may not match the filters)
maxItemsinteger501–1250 (25 per page, the site shows at most 50 pages)
maxPagesinteger101–50. The default caps a run at 250 ads even when maxItems is higher — the status says when it did
detailbooleanfalseOpen each ad page (+1 request, about 3.75 s each with the polite pause: ~900 ads per hour)
fieldsstring[][]Output only these fields, in this order. id is always kept (and detailError with detail)

Categories and cities are matched exactly — ignoring letter case, umlauts (ü = ue) and punctuation — never by a guess: Frankfurt is not taken as Frankfurt am Main (there is a Frankfurt (Oder)), and a category name the site uses in two places (altenpflege, umzug-transport …) needs its id. An unknown or ambiguous value, an invalid radius or a malformed attribute fails before the search with a "did you mean" and the valid options, instead of silently searching something else. In fields, wrong letter case or a near miss (postcod) is read as the field and noted in the status; unknown names are ignored with a note; if no name is valid the run fails instead of saving empty rows. Repeated ads (new ads shift the pages) are always dropped: no ad is saved or billed twice.

Reference

Top-level categories

CategoryidslugPopular sub-categories (id slug)
Auto, Rad & Boot210auto-rad-boot216 autos, 223 autoteile-reifen, 211 boote-bootszubehoer, 217 fahrraeder, 305 motorraeder-roller, 306 motorraeder-roller-teile
Elektronik161multimedia-elektronik172 audio-hifi, 245 foto, 173 handy-telekom, 176 haushaltsgeraete, 279 konsolen, 278 notebooks, 228 pcs, 175 tv-video
Haus & Garten80haus-garten89 garten-pflanzen, 84 heimwerken, 88 wohnzimmer
Immobilien195immobilien203 wohnung-mieten, 196 wohnung-kaufen, 208 haus-kaufen
Familie, Kind & Baby17familie-kind-baby25 kinderwagen-buggys, 23 spielzeug
Mode & Beauty153mode-beauty154 kleidung-damen
Jobs102jobs
Dienstleistungen297dienstleistungen
Haustiere130haustiere
Unterricht & Kurse235unterricht-kurse
Eintrittskarten & Tickets231eintrittskarten-tickets
Freizeit, Hobby & Nachbarschaft185freizeit-nachbarschaft
Musik, Filme & Bücher73musik-film-buecher
Verschenken & Tauschen272zu-verschenken-tauschen
Nachbarschaftshilfe400nachbarschaftshilfe

The full tree of 159 categories (id, slug, name, parent) is built in: see ./src/dictionaries.ts or kleinanzeigen.de/s-kategorien.html. Any category id from a URL (…/c217) works.

Cities (location)

CityidCityidCityid
Berlin3331Hamburg9409München6411
Köln945Frankfurt am Main4292Stuttgart9280
Düsseldorf2068Leipzig4233Dortmund1085
Dresden3820Hannover3155Duisburg2131
Bochum1932Wuppertal1561Bielefeld1056
Bonn1038Mannheim7971Wiesbaden4897
Mönchengladbach1957Gelsenkirchen1000Aachen1921
Braunschweig2448Kiel663Chemnitz3869
Halle (Saale)2409Magdeburg2227Freiburg im Breisgau9354
Krefeld1971Mainz5315Lübeck409
Oberhausen1281Kassel4922Hagen2009
Potsdam7958Saarbrücken382Ludwigshafen am Rhein5381
Oldenburg3108Osnabrück3117Leverkusen1989
Darmstadt4888Würzburg7667Ingolstadt7586
Ulm9339Wolfsburg3071Göttingen3130
Heilbronn9228Pforzheim9260Offenbach am Main4353

Essen, Bremen, Nürnberg, Münster, Karlsruhe, Augsburg, Erfurt, Rostock, Hamm, Heidelberg and Regensburg aren't built in yet (their ids couldn't be collected because of rate limits). Use locationSlug + locationId from a kleinanzeigen URL, e.g. open kleinanzeigen.de/s-essen/k0 and copy the l… number.

Examples

Reseller alert: private iPhone 15 offers in Munich (+20 km), €200–700, last 2 hours

{ "query": "iphone 15", "category": "handy-telekom", "location": "München", "radiusKm": 20, "sellerType": "private", "priceFrom": 200, "priceTo": 700, "sinceHours": 2, "maxItems": 50 }

Price research: e-bikes across Germany, cheapest first

{ "query": "e-bike", "category": "fahrraeder", "attributes": { "fahrraeder.type_s": "ebike" }, "sort": "price_asc", "maxItems": 250, "fields": ["title", "price", "priceType", "postcode", "url"] }

Buyer-intent leads: people looking for a flat in Leipzig

{ "query": "", "category": "wohnung-mieten", "location": "Leipzig", "adType": "wanted", "maxItems": 100 }

Competitor monitoring: commercial bike shops in Berlin with detail pages

{ "query": "gravel", "category": "fahrraeder", "location": "Berlin", "sellerType": "commercial", "detail": true, "maxItems": 30 }

Output

Example item (run 2 above, detail: true, trimmed):

{
"id": "3511155909",
"url": "https://www.kleinanzeigen.de/s-anzeige/iphone-15-pro-256gb-titan-schwarz-top-zustand/3511155909-173-16355",
"title": "iPhone 15 Pro 256GB Titan Schwarz - Top Zustand",
"description": "Ich verkaufe mein gepflegtes iPhone 15 Pro mit 256 GB Speicher…",
"price": 630,
"priceType": "negotiable",
"priceText": "630 € VB",
"oldPrice": null,
"currency": "EUR",
"postcode": "80799",
"locationName": "Maxvorstadt",
"publishedAt": "2026-09-13T08:35:00.000Z",
"dateText": "Heute, 10:35",
"shipping": true,
"directBuy": true,
"isTopAd": false,
"promotions": [],
"cardAttributes": [],
"sellerType": "private",
"image": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/98/9828193c-…?rule=$_59.AUTO",
"imagesCount": 16,
"query": "iphone 15",
"fetchedAt": "2026-09-13T08:40:38.626Z",
"category": "Handy & Telefon",
"localityFull": "80799 München - Maxvorstadt",
"latitude": 48.1510227,
"longitude": 11.5757012,
"attributes": { "Art": "Apple", "Farbe": "Schwarz", "Gerät & Zubehör": "Gerät", "Zustand": "Sehr Gut" },
"detailFetched": true
}
FieldDescription
id, url, title, descriptionAd id (stable), ad URL, title, teaser
price, priceType, priceText, oldPrice, currencyfixed, negotiable (VB), free (Zu verschenken), on_request; oldPrice when reduced
postcode, locationName, locationFrom the result card
publishedAt, dateTextISO time (Europe/Berlin converted to UTC); older ads have a date only. Real-estate cards print no date — it is taken from the page's own ad data
shipping, directBuy"Versand möglich", "Direkt kaufen"
isTopAd, sellerType, shopName, shopUrlisTopAd and sellerType (private / commercial) come from the ad data kleinanzeigen ships with each result page; shopName = PRO shop or agency name on the card
promotions, cardAttributesPaid features of the ad (TOP_AD, PRIORITY_AD, …) and the short facts line of the card ("81 m²", "3 Zi.", "181.000 km", "EZ 04/2013")
image, imagesCount, query, searchTotal, searchUrl, fetchedAt
titleFull, status, descriptionFull, category, localityFull, postedDate, latitude, longitude, attributes, features, sellerName, sellerTypeDetail, sellerActiveSince, sellerBadges, posterId, views, photosdetail: true only (views is usually null: the counter is loaded by JavaScript)
detailFetched, detailErrordetail: true only: detailFetched: false with the reason in detailError when an ad page could not be read ("ad no longer on kleinanzeigen.de (HTTP 404)"), or "skipped: …" for the ads after kleinanzeigen.de blocked ad pages

The run also writes a SUMMARY record (key-value store): ads saved, matching total, pages read, "detail for N of M", ads skipped by includeTopAds / sinceHours, and why the run stopped early.

Use it from code / agents

Apify API (curl)

curl -X POST "https://api.apify.com/v2/acts/yadroo~kleinanzeigen-de/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"query":"playstation 5","location":"Hamburg","sellerType":"private","priceTo":350}'

JavaScript (apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/kleinanzeigen-de').call({ query: 'thinkpad', category: 'notebooks', sort: 'price_asc', maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/kleinanzeigen-de").call(run_input={"query": "sofa", "location": "Köln", "adType": "offer", "maxItems": 50})
items = client.dataset(run["defaultDatasetId"]).list_items().items

AI agents (MCP): connect https://mcp.apify.com?actors=yadroo/kleinanzeigen-de to Claude, Cursor or any MCP client.

Pricing

Pay per event: $0.005 per run start + $0.002 per ad in the dataset. Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the ad price; the start event is the same on every plan. Platform usage is included.

  • 50 ads (default): $0.105
  • Hourly alert returning about 10 new ads: about $0.025 per run
  • 250-ad price study: $0.505

detail: true doesn't change the price but is slow, about 3.75 s per ad. Maximum cost per run is respected: the run stops at the last ad your limit pays for and says so ("Stopped at your spending limit: N rows delivered").

Limits & FAQ

  • Speed (measured from Apify's cloud, 02.10.2026): about 250–300 ads a minute from search pages (1,250 ads in about 5 minutes) and about 16 ads a minute with detail: true — about 900 ads with detail in the default 1-hour run timeout. Ads are saved page by page (with detail, every 5 ads), so a run that reaches its timeout stops just before it, keeps every ad it read and ends with "Stopped before the run timeout: N rows saved". Raise the run timeout or split the search for more.
  • Rate limits are strict. kleinanzeigen.de temporarily blocks IP ranges after bursts of requests ("IP-Bereich vorübergehend gesperrt"). The actor waits 2.5–4 s between pages and detail pages, waits 45 s and retries once on a block (when the run has time left for it), then:
    • on the first search page, with nothing saved yet, the run fails with a clear error (you aren't charged for ads);
    • later in pagination, it stops and keeps the ads already saved; the status names the page;
    • on detail pages, the rest of that search page is saved without detail (detailError: "skipped: …"), no further pages are read, and the status says after how many ad pages the block came.
  • Keep scheduled runs small: frequent runs with maxPages 1–3 and sinceHours work better than one huge run.
  • maxPages: with the default 10 a run reads at most 250 ads. When maxPages stopped a run before maxItems, the status says so — raise maxPages (max 50).
  • Pagination cap: the site shows at most 50 pages (1 250 ads) per search. Split big searches by category or city.
  • Dates: cards show "Heute/Gestern, HH:MM" for recent ads and a date for older ones. Date-only ads get midnight Berlin time. Real-estate cards (wohnung-mieten, haus-kaufen …) show no date at all; the actor reads it from the ad data embedded in the same page.
  • Top ads: recognised by the site's own top-ad flag, not by a missing date. By default they are skipped (includeTopAds: true keeps them); an ad with the paid PRIORITY_AD feature is a normal result and is kept.
  • Not included: phone numbers and messaging (behind login on kleinanzeigen.de), and view counters (loaded by JavaScript).
  • Personal data (GDPR): ads of private sellers can contain personal data — the seller name and "active since" with detail: true, and whatever sellers write in titles and descriptions. If you store or process it, you are responsible under the GDPR: have a legal basis (e.g. a documented legitimate interest), keep only what you need (fields), and delete it when you no longer need it.
  • Roadmap: more built-in cities, attribute dictionaries per category (car make, bike type, clothing size).

Made by Yadroo. Sibling actors: Willhaben.at (Austria) · Otodom.pl (Poland) · Marktplaats.nl · AutoScout24 cars · Rightmove UK · Krisha.kz