Kleinanzeigen.de Scraper — German Classifieds Search
Pricing
from $1.40 / 1,000 result items
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
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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"inhandy-telekom, private sellers, below your buy price,sinceHours: 2on 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
priceofpriceType: "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: 10gives 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.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
query | string | – (prefill fahrrad) | Keywords. Can be empty when category is set. |
category | string | – (all) | Category id (216), code (c216), slug (autos) or German name (Handy & Telefon; umlauts optional). Empty or k0 = all. See Reference. |
location | string | – | City from Reference → Cities, written in full (umlauts optional: Muenchen). Empty = all Germany. |
locationSlug + locationId | string | – | Any other place, taken from a kleinanzeigen URL (/s-bad-toelz/…/k0l7536 → bad-toelz, l7536). v0.1 inputs. |
radiusKm | integer | – | 5, 10, 20, 30, 50, 100, 150, 200 (needs a location) |
priceFrom / priceTo | integer | – | € |
sellerType | string | all | all, private, commercial |
adType | string | offer | offer (Angebote), wanted (Gesuche), all |
shippingOnly | boolean | false | Only "Versand möglich" |
attributes | object | {} | Category attributes from a URL after +, e.g. {"fahrraeder.type_s": "ebike"}, {"autos.marke_s": "bmw"}, {"global.zustand": "like_new"} |
sort | string | newest | newest (sent to the site explicitly — without it cars and real estate come in "Empfohlen" order), price_asc, distance |
sinceHours | integer | – | Only ads posted in the last N hours |
includeTopAds | boolean | false | Keep the paid top ads pinned above the results (they ignore the sort order and may not match the filters) |
maxItems | integer | 50 | 1–1250 (25 per page, the site shows at most 50 pages) |
maxPages | integer | 10 | 1–50. The default caps a run at 250 ads even when maxItems is higher — the status says when it did |
detail | boolean | false | Open each ad page (+1 request, about 3.75 s each with the polite pause: ~900 ads per hour) |
fields | string[] | [] | 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
| Category | id | slug | Popular sub-categories (id slug) |
|---|---|---|---|
| Auto, Rad & Boot | 210 | auto-rad-boot | 216 autos, 223 autoteile-reifen, 211 boote-bootszubehoer, 217 fahrraeder, 305 motorraeder-roller, 306 motorraeder-roller-teile |
| Elektronik | 161 | multimedia-elektronik | 172 audio-hifi, 245 foto, 173 handy-telekom, 176 haushaltsgeraete, 279 konsolen, 278 notebooks, 228 pcs, 175 tv-video |
| Haus & Garten | 80 | haus-garten | 89 garten-pflanzen, 84 heimwerken, 88 wohnzimmer |
| Immobilien | 195 | immobilien | 203 wohnung-mieten, 196 wohnung-kaufen, 208 haus-kaufen |
| Familie, Kind & Baby | 17 | familie-kind-baby | 25 kinderwagen-buggys, 23 spielzeug |
| Mode & Beauty | 153 | mode-beauty | 154 kleidung-damen |
| Jobs | 102 | jobs | |
| Dienstleistungen | 297 | dienstleistungen | |
| Haustiere | 130 | haustiere | |
| Unterricht & Kurse | 235 | unterricht-kurse | |
| Eintrittskarten & Tickets | 231 | eintrittskarten-tickets | |
| Freizeit, Hobby & Nachbarschaft | 185 | freizeit-nachbarschaft | |
| Musik, Filme & Bücher | 73 | musik-film-buecher | |
| Verschenken & Tauschen | 272 | zu-verschenken-tauschen | |
| Nachbarschaftshilfe | 400 | nachbarschaftshilfe |
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)
| City | id | City | id | City | id |
|---|---|---|---|---|---|
| Berlin | 3331 | Hamburg | 9409 | München | 6411 |
| Köln | 945 | Frankfurt am Main | 4292 | Stuttgart | 9280 |
| Düsseldorf | 2068 | Leipzig | 4233 | Dortmund | 1085 |
| Dresden | 3820 | Hannover | 3155 | Duisburg | 2131 |
| Bochum | 1932 | Wuppertal | 1561 | Bielefeld | 1056 |
| Bonn | 1038 | Mannheim | 7971 | Wiesbaden | 4897 |
| Mönchengladbach | 1957 | Gelsenkirchen | 1000 | Aachen | 1921 |
| Braunschweig | 2448 | Kiel | 663 | Chemnitz | 3869 |
| Halle (Saale) | 2409 | Magdeburg | 2227 | Freiburg im Breisgau | 9354 |
| Krefeld | 1971 | Mainz | 5315 | Lübeck | 409 |
| Oberhausen | 1281 | Kassel | 4922 | Hagen | 2009 |
| Potsdam | 7958 | Saarbrücken | 382 | Ludwigshafen am Rhein | 5381 |
| Oldenburg | 3108 | Osnabrück | 3117 | Leverkusen | 1989 |
| Darmstadt | 4888 | Würzburg | 7667 | Ingolstadt | 7586 |
| Ulm | 9339 | Wolfsburg | 3071 | Göttingen | 3130 |
| Heilbronn | 9228 | Pforzheim | 9260 | Offenbach am Main | 4353 |
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}
| Field | Description |
|---|---|
id, url, title, description | Ad id (stable), ad URL, title, teaser |
price, priceType, priceText, oldPrice, currency | fixed, negotiable (VB), free (Zu verschenken), on_request; oldPrice when reduced |
postcode, locationName, location | From the result card |
publishedAt, dateText | ISO 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, shopUrl | isTopAd 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, cardAttributes | Paid 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, photos | detail: true only (views is usually null: the counter is loaded by JavaScript) |
detailFetched, detailError | detail: 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 ApifyClientclient = 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 (withdetail, 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
maxPages1–3 andsinceHourswork better than one huge run. maxPages: with the default 10 a run reads at most 250 ads. WhenmaxPagesstopped a run beforemaxItems, the status says so — raisemaxPages(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: truekeeps them); an ad with the paidPRIORITY_ADfeature 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