Kleinanzeigen.de Scraper
Pricing
from $3.50 / 1,000 results
Kleinanzeigen.de Scraper
Scrape listings from Kleinanzeigen.de (formerly eBay Kleinanzeigen) — Germany's largest classifieds platform with 50M+ listings. Extract prices, seller info, vehicle specs (km, year, fuel), real estate details (m², rooms, rent) and photos.
Pricing
from $3.50 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Kleinanzeigen.de Scraper — German Classifieds Data Extractor for Cars, Real Estate, Electronics, Fashion & Services
The most complete Kleinanzeigen.de data extraction tool on Apify. Pull live listing data from Germany's largest classifieds marketplace (formerly eBay Kleinanzeigen) — prices in EUR, seller type (Privat/Gewerblich), vehicle specs (km, Erstzulassung, Kraftstoff), real-estate details (Wohnfläche, Zimmer, Kaltmiete, Nebenkosten), images and full descriptions — structured for price benchmarking, used-car arbitrage, rental comps, dropshipping research and brand monitoring across the DACH region.
What This Actor Does
The Kleinanzeigen.de Scraper is a production-ready Apify Actor that extracts live classified listings from kleinanzeigen.de — the platform formerly known as eBay Kleinanzeigen, now operated independently and serving over 50 million active listings across Germany. It is the country's dominant consumer-to-consumer marketplace, the de-facto venue for used cars, apartments, electronics, furniture, fashion, services and second-hand goods of every kind.
The actor hands you back the same data a buyer sees on the page — but as clean, normalized JSON ready for a warehouse, a dashboard or a model training pipeline. In a single run you can pull thousands of listings filtered by category, keyword, location and seller type, with full detail-page enrichment optional per run.
Each record can include:
- Listing core — title, listing ID, price (parsed from German
1.990,50 €format), price type (VBnegotiable /Festpreisfixed /Zu verschenkenfree), currency, condition (Neu,Gebraucht,Defekt,Generalüberholt), and the canonical listing URL - Geo — location string, postal code (PLZ) parsed from
64405 Fischbachtal-style fields - Seller — seller name, seller type (
Privatprivate /Gewerblichcommercial), member-since date and rating where displayed - Recency —
postedDatenormalized from German natural-language ("Heute", "Gestern", "vor 3 Tagen", "28.04.2026") to ISOYYYY-MM-DD - Media — primary image plus the full image gallery from the detail page
- Engagement — view count when scraped with details
- Vehicle-specific (category
c216Autos and adjacent) — Kilometerstand, Erstzulassung, Kraftstoff, Getriebe, Leistung (PS/kW), Fahrzeugtyp, Hubraum - Real-estate-specific (categories
c195Mietwohnungen,c196Eigentumswohnungen and adjacent) — Wohnfläche, Zimmer, Kaltmiete, Nebenkosten, Etage, Verfügbar ab - Metadata —
scrapedAtISO timestamp on every row
Whether you run a Hamburg used-car dealership, a Berlin sneaker reseller, a Munich rental-comp analytics product or a market-intel team tracking second-hand pricing across Germany, this actor is the fastest path from kleinanzeigen.de to a usable dataset — without writing a line of scraping code.
Why scrape Kleinanzeigen yourself when this exists?
Kleinanzeigen looks like a simple classifieds site. Scraping it at any meaningful scale is not. Teams who try DIY hit the same wall:
- ❌ Cloudflare bot protection sits in front of every page — naive
requests.get()returns the "Just a moment…" challenge HTML, not the listing - ❌ German number and date formats —
1.990,50is not "1990.50";Heute,Gestern,vor 5 Tagenneed parsing into real dates - ❌ CSS class name churn — the site uses obfuscated/prefixed classes (
aditem-main--top--left,addetailslist) that rotate periodically - ❌ Mixed card vs. detail-page schema — search cards expose only a subset of fields; the rest live one click deep on the detail page
- ❌ Category-specific attribute tables — vehicles have a
Kilometerstand/Erstzulassungtable; apartments haveWohnfläche/Kaltmiete; you need per-category logic - ❌ Pagination via URL slugs (
/seite:2,/seite:3…) rather than query params - ❌ Mixed seller signals —
PrivatvsGewerblichis inferred from badge text,/pro/URL slugs and account hints - ❌ Image lazy-loading — first-page images are placeholders; the real
data-imgsrconly resolves after the gallery JS executes - ❌ PLZ inside location string — the postal code is glued to the city name and must be regex-extracted
- ❌ Listings disappear — sold or expired ads return 404 within hours of removal; scraping must be tolerant
This actor solves every one of those: Playwright in headed mode with anti-detection patches bypasses Cloudflare without proxies, the parser normalizes German numerals and dates, category-aware logic populates vehicle and property fields automatically, and the pipeline pushes deduplicated records straight to the Apify dataset.
Quick Start
One-Click Run
- Open the actor page on Apify Store and click "Try for free"
- Either paste a Kleinanzeigen search URL into Search URLs (e.g.
https://www.kleinanzeigen.de/s-autos/c216) or fill Keyword + Location (e.g.iphone+berlin) - Toggle Scrape Detail Pages on for the full schema including vehicle/real-estate fields and seller info
- Hit Start — listings stream into your dataset and can be exported as JSON, CSV, Excel, HTML or RSS
API Run (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/kleinanzeigen-scraper").call(run_input={"searchUrls": ["https://www.kleinanzeigen.de/s-autos/c216","https://www.kleinanzeigen.de/s-muenchen/iphone/k0l5941"],"scrapeDetails": True,"maxListings": 500,"maxPages": 20,"requestDelay": 2000})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"], listing["location"], listing["sellerType"])
API Run (Node.js / TypeScript)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/kleinanzeigen-scraper').call({keyword: 'bmw 320d',location: 'hamburg',scrapeDetails: true,maxListings: 200,maxPages: 10});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Pulled ${items.length} BMW 320d listings around Hamburg`);
API Run (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~kleinanzeigen-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchUrls": ["https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331"],"scrapeDetails": true,"maxListings": 300,"maxPages": 12}'
How It Works
Kleinanzeigen.de is a server-rendered marketplace protected by Cloudflare with active bot-detection. The actor runs Playwright (Chromium) in headed mode with anti-automation patches that defeat the challenge without requiring residential proxies in most cases.
Source URL patterns
| Pattern | Example | Purpose |
|---|---|---|
/s-{category}/c{categoryId} | /s-autos/c216 | Browse by top-level category |
/s-{location}/{keyword}/k0l{locationId} | /s-muenchen/iphone/k0l5941 | Keyword search within a city |
/s-{keyword}/k0 | /s-sofa/k0 | Nationwide keyword search |
/{baseUrl}/seite:{page} | /s-autos/c216/seite:3 | Pagination — page 1 is the bare URL |
/s-anzeige/{slug}/{id}-{cat}-{loc} | /s-anzeige/bmw-320d/2123456789-216-5941 | Detail page for a single listing |
Engineering pipeline
- Headed Chromium via Playwright — bypasses Cloudflare's JS challenge without a proxy in 90%+ of runs
navigator.webdriverpatch + window.chrome stub — removes the most-fingerprinted automation signalde-DElocale + 1920×1080 viewport — request shape matches a German desktop user- Cloudflare wait loop — up to 15 × 2-second polls for
Just a moment/Verify you are humanto clear before parsing - Retry with backoff — up to 3 attempts per page with 5s, 10s, 15s exponential delay
- Cheerio parsing — runs on the rendered HTML after Cloudflare clears, no JS in the parse phase
- German numeral parser — handles
1.990,50 €→1990.5and stripsVB/Festpreis/Zu verschenkenmarkers - German date parser —
Heute/Gestern/vor N Tagen/DD.MM.YYYY→ ISOYYYY-MM-DD - Category-aware detail parser — walks
[id*="viewad-details"] liand key-value attribute tables, then populates vehicle or real-estate fields based on the German label keys - 5-variant detail extraction — to survive Kleinanzeigen's rotating markup, the detail parser combines five selector strategies for every attribute and takes the first non-empty hit:
.addetailslist--detailclass blocks (the current default markup)<li>"Label: Value" / "Label – Value" text parsing<dl><dt>/<dd>definition lists- Table
<tr>key/value rows - Plain-text regex fallback against the German label vocabulary (Marke, Modell, Erstzulassung, Kilometerstand, Kraftstoffart, Getriebe, Leistung, Fahrzeugtyp, Hubraum, Anzahl der Türen, Schadstoffklasse, Umweltplakette, HU bis, Klimatisierung, Wohnfläche, Zimmer, Etage, Kaltmiete, Nebenkosten, Warmmiete, Kaution, Verfügbar ab, Heizungsart, Baujahr, …)
tel:href extraction — phone numbers are pulled from the detail page'stel:anchor when present (commercial sellers only — see FAQ)- Verified live coverage with
scrapeDetails: true— viewCount 100%, condition / sellerName / sellerType / sellerMemberSince / description / images / postedDate 90–100%, vehicle specs (erstzulassung, kraftstoff, getriebe, leistung, fahrzeugtyp, kilometerstand) ~90% on Autos /c216. Phone populates on ~30% of listings (Gewerblich-only ceiling). - Pagination verified live — a BMW Berlin run returned 54 listings on page 1 and respected
maxListings=30; the actor walks/seite:Nup tomaxPages(default 10) - JSON-LD fallback — when
Product/Car/Apartmentschema is present, missing fields are backfilled - Deduplication — by
listingId(data-adid) with URL fallback so cross-page repeats are dropped - Configurable inter-request delay — default 2000 ms + jitter to stay polite
The result: a clean, normalized JSON stream that looks the same whether you scraped Berlin apartments, Hamburg cars or Frankfurt iPhones.
Input Parameters
{"searchUrls": ["https://www.kleinanzeigen.de/s-autos/c216"],"keyword": "","location": "","scrapeDetails": false,"maxListings": 100,"maxPages": 10,"requestDelay": 2000,"proxyConfiguration": { "useApifyProxy": false }}
Parameter reference
| Parameter | Type | Default | Description |
|---|---|---|---|
searchUrls | array<string> | ["https://www.kleinanzeigen.de/s-autos/c216"] | Direct Kleinanzeigen search, category or location URLs. When provided, keyword and location are ignored. Pagination is appended automatically as /seite:N. |
keyword | string | "" | Search term used when no searchUrls are supplied. Examples: iphone, bmw 320d, wohnung, sofa, playstation 5, kinderwagen. URL-encoded automatically. |
location | string | "" | City or region slug used in the URL. Examples: berlin, muenchen, hamburg, koeln, frankfurt, stuttgart, duesseldorf, leipzig. Combined with keyword to build /s-{location}/{keyword}/k0. |
scrapeDetails | boolean | false | When true, opens each listing's detail page to populate full description, image gallery, view count, seller info, condition, postal code and category-specific attributes (vehicle specs, real-estate details). Increases run time roughly 5-10× per listing. |
maxListings | integer | 100 | Hard cap on total listings written to the dataset. 0 = unlimited. Use a small value (10-50) when testing. |
maxPages | integer | 10 | Maximum search-result pages to walk per task. Each page returns ~25 listings. |
requestDelay | integer (ms) | 2000 | Pause between consecutive requests. Random jitter up to 500 ms is added on top to look more human. Range: 0–15000. |
proxyConfiguration | object | { "useApifyProxy": false } | Standard Apify proxy block. Usually leave off — Playwright headed mode beats Cloudflare alone. Turn on Apify Residential if you see persistent challenge pages. |
Output Schema
Every record uses one flat schema regardless of category, so a vehicle row and an apartment row can sit side-by-side in the same table — category-specific fields are simply null where they don't apply.
Core listing fields (always populated when discoverable)
| Field | Type | Description |
|---|---|---|
listingId | string | Kleinanzeigen data-adid — unique per listing |
title | string | Listing headline as shown on the card |
price | number | Numeric EUR price (parsed from German format, 1.990,50 € → 1990.5) |
priceType | string | One of VB (Verhandlungsbasis / negotiable), Festpreis (fixed), Zu verschenken (free) |
currency | string | Always EUR when a price is present |
category | string | Category name from the card tag or breadcrumb (e.g. Wohnungen, Smartphones, Damenkleidung) |
condition | string | Neu, Gebraucht, Defekt, Generalüberholt — populated from detail page |
location | string | Raw city/region string as shown (e.g. 10115 Berlin, 80331 München) |
postalCode | string | 5-digit PLZ extracted from the location string |
postedDate | string | ISO YYYY-MM-DD parsed from German natural language |
listingUrl | string | Canonical detail-page URL |
imageUrl | string | Primary image URL |
images | array<string> | Full image gallery (detail-page enrichment) |
scrapedAt | string | ISO-8601 timestamp of extraction |
Seller fields (populated when detail-page enrichment is on)
| Field | Type | Live coverage | Description |
|---|---|---|---|
sellerName | string | ~90–100% | Display name on the user profile widget |
sellerType | string | ~90–100% | Privat or Gewerblich — inferred from badges and /pro/ URLs |
sellerRating | string | sparse | Reputation indicator where shown |
sellerMemberSince | string | ~90–100% | Account-creation indicator (e.g. März 2018, 2019) |
description | string | ~90–100% | Full listing description (truncated to 2000 chars) |
viewCount | number | 100% | Detail-page view count published by Kleinanzeigen |
phone | string | ~30% (Gewerblich only) | Phone parsed from the detail page tel: anchor. Private sellers have phone hidden by Kleinanzeigen — only the platform's contact form (email) is exposed. See FAQ. |
condition | string | ~90% | Neu, Gebraucht, Defekt, Generalüberholt |
images | array<string> | ~90–100% | Full image gallery from the detail page |
postedDate | string | ~90–100% | ISO date parsed from German natural language |
Vehicle fields (Autos / c216 and adjacent categories)
Verified live coverage on Autos detail pages is now ~90% for every field below (up from 0% in earlier builds), driven by the new 5-variant detail extractor described under Engineering pipeline.
| Field | German label | Live coverage | Description |
|---|---|---|---|
kilometerstand | Kilometerstand / Laufleistung | ~90% | Odometer in km (number) |
erstzulassung | Erstzulassung / EZ / Baujahr | ~90% | First-registration month/year (e.g. 06/2018) |
kraftstoff | Kraftstoff / Antrieb | ~90% | Benzin, Diesel, Elektro, Hybrid, LPG, CNG |
getriebe | Getriebe / Schaltung | ~90% | Schaltgetriebe, Automatik, Halbautomatik |
leistung | Leistung (PS / kW) | ~90% | Engine output |
fahrzeugtyp | Fahrzeugtyp / Karosserie | ~90% | Limousine, Kombi, SUV, Coupé, Cabrio, Van, Kleinwagen |
hubraum | Hubraum (ccm) | populated where shown | Engine displacement |
Real-estate fields (Wohnung / Haus categories)
| Field | German label | Description |
|---|---|---|
wohnflaeche | Wohnfläche | Living area in m² |
zimmer | Zimmer / Räume | Room count (number) |
kaltmiete | Kaltmiete / Nettomiete | Base rent in EUR excluding utilities (number) |
nebenkosten | Nebenkosten / Betriebskosten | Monthly utilities in EUR (number) |
etage | Etage / Stockwerk / Geschoss | Floor |
verfuegbarAb | Verfügbar ab / Bezugsfrei ab | Move-in date |
Example: vehicle listing (Autos, scrapeDetails: true)
{"listingId": "2123456789","title": "BMW 320d Touring M-Sport Pano LED Navi","price": 18990,"priceType": "VB","currency": "EUR","category": "Autos","condition": "Gebraucht","location": "80331 München","postalCode": "80331","postedDate": "2026-05-12","sellerName": "Auto Bayern GmbH","sellerType": "Gewerblich","sellerMemberSince": "März 2017","description": "BMW 320d Touring, M-Sportpaket, Panoramadach, LED-Scheinwerfer, Professional Navi, beheizbare Sitze, 1. Hand, scheckheftgepflegt...","imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/abc/abc123.jpg","images": ["https://img.kleinanzeigen.de/api/v1/prod-ads/images/abc/abc123.jpg"],"viewCount": 432,"kilometerstand": 112400,"erstzulassung": "06/2018","kraftstoff": "Diesel","getriebe": "Automatik","leistung": "190 PS","fahrzeugtyp": "Kombi","hubraum": "1995 ccm","listingUrl": "https://www.kleinanzeigen.de/s-anzeige/bmw-320d-touring/2123456789-216-5941","scrapedAt": "2026-05-16T10:24:31.000Z"}
Example: apartment rental listing (Mietwohnungen, scrapeDetails: true)
{"listingId": "2098765432","title": "Helle 3-Zimmer-Wohnung mit Balkon in Prenzlauer Berg","price": 1450,"priceType": "Festpreis","currency": "EUR","category": "Mietwohnungen","location": "10405 Berlin","postalCode": "10405","postedDate": "2026-05-15","sellerName": "Maria K.","sellerType": "Privat","sellerMemberSince": "Januar 2021","viewCount": 1284,"wohnflaeche": "82 m²","zimmer": 3,"kaltmiete": 1450,"nebenkosten": 245,"etage": "5. OG","verfuegbarAb": "01.07.2026","listingUrl": "https://www.kleinanzeigen.de/s-anzeige/3-zimmer-prenzlauer-berg/2098765432-203-3331","scrapedAt": "2026-05-16T10:25:02.000Z"}
Price Type & Seller Type Reference
Price types (priceType field)
| Value | German Meaning | Buyer Interpretation |
|---|---|---|
VB | Verhandlungsbasis | Negotiable — seller open to offers, price is a starting point |
Festpreis | Fixed price | Take it or leave it — no haggling expected |
Zu verschenken | Free / gift | Item is free; pickup arranged |
null | Not stated | Seller did not mark a price type; treat raw price as nominal |
Seller types (sellerType field)
| Value | German Meaning | Implication |
|---|---|---|
Privat | Private individual | Consumer-to-consumer sale, no warranty, no VAT invoice |
Gewerblich | Commercial / business | Dealer, shop or registered trader; warranty and VAT invoice apply under German law |
null | Unknown | Detail page not scraped or badge missing |
Condition (condition field)
| Value | German Meaning |
|---|---|
Neu | New, unused |
Gebraucht | Used |
Defekt | Defective / for parts |
Generalüberholt | Refurbished / overhauled |
Use Cases
Reseller & Dropshipping Sourcing
Sneaker flippers, vintage-electronics resellers, retro-gaming sellers and Amazon FBA arbitrage operators use the dataset to:
- Identify mispriced listings — pull every PS5, iPhone 15, Air Jordan, Lego Modular below market median and contact the seller within hours
- Filter
Privatonly to find C2C deals untouched by professional dealers who price to retail - Track sneaker drops by keyword in real time across Berlin, München, Hamburg, Köln, Frankfurt
- Bulk-source furniture / fashion by category for Vinted, eBay and Etsy resale channels
- Spot
Zu verschenkenitems with resale value — free pickup, pure margin
Used-Car Arbitrage & Dealer Intelligence
Car dealers, leasing companies and auto-flippers use the vehicle-specific schema to:
- Build live pricing matrices by make, model, year, fuel and Kilometerstand across all of Germany
- Spot underpriced cars within hours of listing —
kilometerstand+erstzulassung+pricelets you compute deviation from MarktIndex on the fly - Monitor competing Gewerblich dealers in your Postleitzahl by filtering
sellerType: "Gewerblich" - Used-car dealer lead-gen — combine
phone+sellerName+ vehicle specs to build a ranked prospecting list of commercial dealers in any region (phone is only published by Gewerblich sellers, making this a clean dealer-only signal) - Vehicle market intelligence — slice power (
leistung) / fuel (kraftstoff) / transmission (getriebe) distributions across price brackets and PLZ to see where Diesel manuals are giving way to EV automatics - Reseller arbitrage on demand signal — combine
viewCount(now 100% populated) withpostedDateto compute views-per-hour and surface "hot" listings before competing flippers find them - Surface trade-in opportunities — high-mileage diesels in regions about to enter Umweltzonen
- Track inventory turnover by re-scraping the same category daily and diffing
listingIdsets
Real-Estate Rental & Sale Comps
Property managers, real-estate startups, build-to-rent operators and relocation consultants use the rental schema to:
- Compute live Kaltmiete per m² by postal code across Berlin, München, Hamburg and other metros
- Benchmark Mietpreisbremse compliance in regulated districts (Mitte, Friedrichshain, Schwabing, Eimsbüttel)
- Track Nebenkosten ranges to forecast Warmmiete affordability
- Spot Eigentumswohnungen below appraisal by combining Wohnfläche, Zimmer and listing age
- Map sublet (
Untermiete) supply in student towns and tourist hubs
Market Research & Consumer Demand Analytics
Brand-side analytics teams, FMCG strategists and trend forecasters use Kleinanzeigen as a real-time consumer-pulse signal:
- Measure second-hand supply of a product (e.g. Thermomix TM6, Dyson V15, Peloton) as a proxy for satiation and churn
- Detect declining product loyalty — when used inventory of a brand spikes, customers are upgrading away
- Track regional taste differences — what's hot in Berlin vs. München vs. Hamburg
- Sentiment-mine descriptions for recurring complaints, defects or compliments
- Validate retail launches — track post-launch resale volume and pricing decay curves
Brand Monitoring & Anti-Counterfeit
Brand-protection and IP-enforcement teams use the actor to:
- Detect counterfeit listings — keyword sweeps for luxury brands (Louis Vuitton, Rolex, Gucci, Nike) cross-referenced against authorized-dealer lists
- Track grey-market activity for region-locked products
- Identify high-volume infringers — flagging Gewerblich sellers with repeat listings under disputed terms
- Document evidence for takedown requests with
scrapedAttimestamps and full image URLs - Monitor early-life returns and theft resale by SKU keywords
Price Benchmarking & Competitive Intelligence
Pricing teams at marketplaces, retailers and B2C SaaS use Kleinanzeigen as the canonical "what consumers will actually pay" baseline:
- Build category-level price indices updated daily across Autos, Elektronik, Möbel, Mode, Sport & Hobby
- A/B compare new vs. used pricing for the same model to model depreciation curves
- Benchmark against eBay.de, mobile.de, ImmoScout24 by aligning category and PLZ
- Detect supply-shock events — when the median price of
iphone 14 prodrops 12% week-over-week, something's happening - Feed dynamic pricing models for trade-in apps, repair shops and refurbishment platforms
Lead Generation & B2B Sales
Recruiters, service-business owners and B2B vendors mine Kleinanzeigen for high-intent leads:
- Find Gewerblich dealers to pitch white-label inventory management, photography, financing
- Source landlords posting
Wohnung zu vermietento pitch property-management SaaS, insurance, vetting tools - Identify tradespeople in
Handwerk & Hausbaufor marketplace acquisition - Pull moving-services listings (
Umzug) for cross-promotion of cleaning, storage, IKEA assembly services - Generate phone-number lead lists where sellers post numbers openly (respecting GDPR consent)
Academic, Journalism & Policy Research
Researchers, data journalists and policy think-tanks use Kleinanzeigen as a real-world dataset on the German informal economy:
- Quantify the second-hand economy as a share of consumer spending by category and region
- Study housing affordability with continuous Kaltmiete/Wohnfläche samples by PLZ
- Cover the EV transition — diesel resale prices, EV used-market depth, Erstzulassung distributions
- Investigate gentrification with hyperlocal rent gradients across Berlin Bezirke
- Train ML models for German NLP (titles + descriptions are a natural language corpus in the wild)
Insurance & Financial Services
Insurers, fintech lenders and warranty providers tap the dataset to:
- Calibrate vehicle-replacement values by km/year/model for Kasko claims
- Score Restwert (residual value) for leasing portfolios at month-end
- Validate declared values on home/renter content insurance from real second-hand prices
- Detect insurance fraud patterns — total-loss vehicles reappearing as "used" sales
Sample Queries & Recipes
Recipe 1: All used BMW 3-Series cars listed in Bavaria
{"searchUrls": ["https://www.kleinanzeigen.de/s-muenchen/bmw-3er/k0l5941"],"scrapeDetails": true,"maxListings": 500,"maxPages": 20}
Pulls every BMW 3er in the München region with Kilometerstand, Erstzulassung, Kraftstoff and Getriebe populated — a ready-made spreadsheet for a used-car arbitrage scan.
Recipe 2: Berlin 3-room rental comps under €2000
{"searchUrls": ["https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/anzeige:angebote/preis::2000/c203l3331+wohnung_mieten.zimmer_d:3,"],"scrapeDetails": true,"maxListings": 300,"maxPages": 12}
All 3-Zimmer Mietwohnungen in Berlin up to €2000 — populates wohnflaeche, kaltmiete, nebenkosten, etage and verfuegbarAb so you can compute €/m² per district.
Recipe 3: PS5 nationwide sweep — flip the underpriced ones
{"keyword": "playstation 5","scrapeDetails": false,"maxListings": 200,"maxPages": 8}
Fast title/price/location pull across all of Germany. Sort by price ASC in your downstream stack to surface flip candidates.
Recipe 4: iPhone listings in München (private sellers only — filter downstream)
{"keyword": "iphone","location": "muenchen","scrapeDetails": true,"maxListings": 150,"maxPages": 6}
After the run, keep only rows where sellerType == "Privat" for true consumer-to-consumer sourcing.
Recipe 5: Hamburg furniture giveaways (Zu verschenken)
{"searchUrls": ["https://www.kleinanzeigen.de/s-zu-verschenken/hamburg/c192l9409"],"scrapeDetails": false,"maxListings": 100,"maxPages": 4}
Every free-pickup listing in Hamburg's gift category — used by upcyclers, restorers and student movers.
Recipe 6: Daily price index — 5 metros, top categories
{"searchUrls": ["https://www.kleinanzeigen.de/s-elektronik/berlin/c161l3331","https://www.kleinanzeigen.de/s-elektronik/muenchen/c161l5941","https://www.kleinanzeigen.de/s-elektronik/hamburg/c161l9409","https://www.kleinanzeigen.de/s-elektronik/koeln/c161l1","https://www.kleinanzeigen.de/s-elektronik/frankfurt/c161l1"],"scrapeDetails": false,"maxListings": 1500,"maxPages": 15}
Schedule daily — feeds a Power BI / Looker dashboard tracking electronics median prices per metro.
Recipe 7: Test sample — 10 listings before committing budget
{"searchUrls": ["https://www.kleinanzeigen.de/s-autos/c216"],"scrapeDetails": true,"maxListings": 10,"maxPages": 1}
Cheap smoke test — 10 cars with full detail enrichment costs pennies and validates your downstream parser.
Integration Examples
Google Sheets (via Apify Integration)
- Schedule the actor in Apify (e.g. every weekday at 07:00 Berlin time) with a fixed
searchUrlslist per market - Attach the "Export to Google Sheets" integration to that schedule
- A fresh worksheet of listings appears each morning — wire it to a pivot table for instant price benchmarks
Make.com / Zapier / n8n
The official Apify connector exists on every major automation platform. Build flows that:
- Trigger when a new listing matches a saved keyword (e.g.
Rolex Submarinerunder €5000) - Send a Slack / Telegram alert with title, price, image and
listingUrl - Filter to
sellerType: "Privat"only - Route Gewerblich leads into a CRM as new accounts
Power BI / Tableau / Looker
Connect the Apify dataset via REST API. Build dashboards covering:
- Median price by category × metro × week
- Used-car depreciation curves by Erstzulassung year
- Rental Kaltmiete heat maps by PLZ
- Supply/demand ratios — listings posted vs. expired per day
- Brand-share of listings within a category
Postgres / Snowflake / BigQuery
Wire the Apify webhook integration to your warehouse ingestion endpoint. The flat JSON schema lands cleanly in a single table — partition by scrapedAt for time-series analysis.
CRM Enrichment (Salesforce, HubSpot, Pipedrive)
For Gewerblich-seller lead generation, run nightly with sellerType: "Gewerblich" filter applied downstream. Upsert into CRM Account records keyed on seller name + PLZ. Create Tasks when the same seller posts >10 new listings in a week (signal of high inventory turnover).
Major German Markets Covered
Kleinanzeigen is nationwide, but listing volume concentrates in the major DACH metros. Common location slugs:
| Metro | Bundesland | Slug | Why It Matters |
|---|---|---|---|
| Berlin | Berlin | berlin | Capital, ~3.7M people, largest listing volume, dense rental market |
| München | Bayern | muenchen | Highest rents in Germany, premium used-car market |
| Hamburg | Hamburg | hamburg | Maritime hub, strong second-hand furniture & maritime gear |
| Köln | Nordrhein-Westfalen | koeln | Rhineland economic centre, dense student rental market |
| Frankfurt am Main | Hessen | frankfurt-am-main | Financial capital, expat-driven listings |
| Düsseldorf | Nordrhein-Westfalen | duesseldorf | Fashion & retail capital, premium-goods resale |
| Stuttgart | Baden-Württemberg | stuttgart | Automotive heartland — exceptional used-car depth |
| Leipzig | Sachsen | leipzig | Fastest-growing East German metro, affordable rentals |
| Dortmund / Essen | Nordrhein-Westfalen | dortmund / essen | Ruhr area, household goods & DIY |
| Dresden / Hannover | Sachsen / Niedersachsen | dresden / hannover | Eastern & central trade hubs |
| Nürnberg / Bremen | Bayern / Bremen | nuernberg / bremen | Franconian + northern logistics centres |
You can also drop the location entirely and search nationwide, or supply your own URL with a custom radius (/s-{location}/radius/...).
Top categories covered
| German Name | English | Category ID |
|---|---|---|
| Autos | Cars | c216 |
| Wohnung mieten / kaufen | Apartments rent / buy | c203 / c196 |
| Haus mieten / kaufen | Houses rent / buy | c200 / c208 |
| Elektronik | Electronics | c161 |
| Handy & Telefon | Phones | c173 |
| Mode & Beauty | Fashion & beauty | c153 |
| Möbel & Wohnen | Furniture & home | c192 |
| Familie, Kind & Baby | Family, kids & baby | c17 |
| Sport & Hobby | Sport & hobby | c139 |
| Jobs / Dienstleistungen | Jobs / services | c102 / c269 |
| Tickets | Tickets | c225 |
| Zu verschenken | Free / giveaway | varies |
Cost & Performance
| Metric | Value |
|---|---|
| Engine | Playwright (Chromium, headed) with anti-detection patches |
| Anti-bot | Built-in Cloudflare challenge wait loop |
| Runtime — list pages only (100 listings) | ~1–2 minutes |
| Runtime — list + detail enrichment (100 listings) | ~6–10 minutes |
| Cost model | Pay-per-event — pay only for what you scrape |
| Data freshness | Live at run time — kleinanzeigen.de doesn't publish historical dumps |
| Auth required | None |
| Proxy required | No — Playwright headed mode handles Cloudflare; Apify Residential available as fallback |
| Concurrency | Safe to run multiple parallel tasks across different categories/cities |
| Memory footprint | 1024 MB minimum (Playwright + Chromium), 4096 MB recommended for large detail runs |
| Dedup | Built-in by listingId / URL across pages |
Tip: For the cheapest run, set
scrapeDetails: falseand use a tightmaxListings. Detail enrichment is the single biggest cost multiplier — turn it on only when you need vehicle/property/seller fields.
Compliance, Privacy & Legal Notes
- Public data only — every field in this dataset is what any anonymous visitor sees on kleinanzeigen.de
- No login or account is used — the actor scrapes only the publicly accessible HTML
- No CAPTCHA solving service is invoked
- GDPR — listing data may contain personal data (seller name, phone number when openly published). Process it lawfully under Art. 6(1)(f) legitimate interest only where appropriate; obtain consent where required for marketing; honor erasure requests promptly; do not enrich with data from other sources without a lawful basis
- TKG / UWG / GeschGehG — German telecommunications, unfair competition and trade-secrets laws apply to use of phone numbers and seller-identifying information. Consult counsel before outbound contact campaigns
- Marketplace Terms of Service — kleinanzeigen.de's ToS restrict commercial scraping. You alone are responsible for ensuring your use case complies with the platform's terms and German law (BGH "Public Beanstandung" line of cases on screen scraping)
- robots.txt — review and respect the current
kleinanzeigen.de/robots.txt. Apify proxies allow IP-level rate management - No PII enrichment is performed automatically — the actor returns only fields already visible in the listing
- Rate limiting — the default 2000 ms delay (+jitter) is conservative; do not lower below 1000 ms without a strong reason
Important: This tool is intended for legitimate research, analytics, price-benchmarking, brand-protection and lawful B2B activity. It is not designed for spam, harassment, scraping logged-in/protected areas, or any activity violating BGB, GDPR, UWG or platform ToS.
Frequently Asked Questions
How fresh is the data?
The actor scrapes live HTML at run time — what you receive is what kleinanzeigen.de displays to visitors at the moment the run executes. Schedule daily/hourly runs to track changes over time.
How many listings can I scrape per run?
There is no hard cap from the actor — set maxListings: 0 for unlimited. Practically, runs of 1,000–5,000 listings per task are routine; very large sweeps (50k+) are best split into multiple scheduled runs across categories or cities.
Does this need login credentials?
No. The actor never logs in. All scraped data is publicly visible to anonymous visitors.
Does the actor handle Cloudflare?
Yes — Playwright runs Chromium in headed mode with navigator.webdriver patches and a German-locale fingerprint. A built-in wait loop polls for the "Just a moment" / "Verify you are human" challenge to clear (up to 30 seconds) before parsing. In 90%+ of runs no proxy is needed.
What if Cloudflare blocks anyway?
Enable proxyConfiguration with Apify Residential proxies for German exit IPs and slightly raise requestDelay. Persistent blocks are rare — if you see them, open an issue with a sample URL.
Can I scrape detail pages and search pages in one run?
Yes — set scrapeDetails: true and the actor will follow each card link to the detail page, populating description, full image gallery, seller info, view count and category-specific attributes.
Which categories are supported?
All of them. Pass any kleinanzeigen.de URL — Autos, Immobilien (mieten / kaufen), Elektronik, Mode, Möbel, Tickets, Jobs, Dienstleistungen, Tiere, Familie & Kind, Sport & Hobby, Zu verschenken. Vehicle and real-estate detail fields are populated automatically when the listing is in those categories.
Are seller phone numbers included?
Only when the seller has openly published a phone number on the listing itself (uncommon for Privat sellers, more common for Gewerblich dealers). The actor does not attempt to extract messaging-system contact data.
Why is phone null on some listings?
By design — this is a Kleinanzeigen-side ceiling, not an actor bug. Kleinanzeigen only exposes a tel: link on the detail page for Gewerblich (commercial) sellers carrying the dealer badge. Privat (private individual) sellers have phone hidden by the platform and must be reached via the on-site contact form, which routes as email through Kleinanzeigen's relay. The actor extracts every phone the platform exposes via tel: — expected live coverage is therefore roughly the share of Gewerblich listings in the slice you scrape (~30% on a broad Autos sweep, far higher when you pre-filter to dealer URLs, near zero on Privat-heavy categories like apartment sublets). If you need phone-rich data, restrict your searchUrls to dealer-only filters (Kleinanzeigen exposes anbieter:gewerblich in many category URLs).
Does pagination actually work?
Yes — verified live. Kleinanzeigen paginates with /seite:N URL slugs and the actor walks them automatically up to maxPages (default 10, max useful in practice ~50 before deeper pages return increasingly stale listings). A recent BMW Berlin run returned 54 listings on page 1 alone and respected maxListings=30 as the hard cap; with maxPages=10 you can comfortably pull 200–500 listings per category-city combination. Page 1 is the bare base URL — /seite:1 is never used.
Does this work for Austria (willhaben.at) or Switzerland (tutti.ch)?
No — this actor is kleinanzeigen.de only. See the Related Actors section for sibling classifieds scrapers in other countries.
Can I filter by price, condition, postal-code radius?
Use a Kleinanzeigen search URL that already includes the filters — the site's URL grammar supports preis::min:max, anzeige:angebote, radius, versand:ja, art:gebraucht|neu and many more. Build the filter on kleinanzeigen.de, copy the resulting URL into searchUrls, and the actor will scrape exactly that filtered slice.
How does pagination work?
Kleinanzeigen paginates with /seite:N URL slugs. The actor appends them automatically up to maxPages. Page 1 is the bare base URL.
Can I run this on the Apify Free Plan?
Yes — small runs fit comfortably in the Free Plan compute budget. Heavy detail-enrichment runs over thousands of listings are better suited to a paid tier with more memory headroom.
Can I schedule daily / hourly runs?
Yes — Apify's built-in Scheduler supports any cron expression. Combine with webhooks to push diffs to Slack, a warehouse or a CRM after each run.
What export formats are supported?
JSON, CSV, Excel (XLSX), HTML, XML, RSS and JSON Lines — directly from the Apify dataset view and the REST API.
How do I deduplicate across multiple runs?
Use listingId (the kleinanzeigen data-adid) as your dedup key downstream. Inside a single run, dedup is already handled.
Will sold or expired listings show up?
Only while they're still indexed on kleinanzeigen.de. Removed listings disappear from search results within hours. Run frequently to capture short-lived inventory.
How accurate is the German price/date parsing?
Very. The parser handles 1.990 €, 1.990,50 €, 1990,50 EUR, 12,50 €, VB, Festpreis, Zu verschenken, Heute, Gestern, vor 3 Tagen, vor 2 Wochen, vor 1 Monat, and DD.MM.YYYY formats. Edge cases fall back to the raw string.
How do I report a bug or request a feature?
Open an issue on the Apify Store page for this actor, or contact the developer through the Apify Console.
Related Apify Actors by Haketa
If you need classifieds and marketplace data from other countries, check these sibling actors:
- 🇩🇪 Kleinanzeigen.de Scraper (Germany) — this actor
- 🇳🇱 Marktplaats.nl Scraper (Netherlands) — Dutch C2C marketplace
- 🇺🇸 OfferUp Scraper (US) — US mobile-first classifieds
- 🇨🇦 Kijiji.ca Scraper (Canada) — Canadian classifieds
- 🇳🇿 TradeMe Scraper (New Zealand) — NZ's flagship marketplace
- 🇲🇾 Lelong.my Scraper (Malaysia) — Malaysia's veteran online marketplace
- 🇻🇳 Chotot.com Scraper (Vietnam) — Vietnam's largest classifieds
- 🌍 Mourjan Scraper (MENA) — Middle-East classifieds
- 🇧🇪 Immoweb.be Belgium Property Scraper — complementary BE real-estate
- 🇦🇺 Domain.com.au Property Scraper — AU real-estate
- 🇦🇪 YallaMotor Scraper (GCC) — GCC vehicle listings
- 🇺🇸 Rent.com Scraper (US) — US rentals
Comparison vs. Alternatives
| Approach | Setup time | Cloudflare handling | Schema normalization | Cost (1k detail listings) | Maintenance burden |
|---|---|---|---|---|---|
| This actor | < 2 minutes | Built-in (Playwright headed) | Built-in (German numerals, dates, categories) | Pennies | None |
requests + BeautifulSoup | 4–8 hours dev | Blocked immediately | DIY | Free + dev cost | Constant — selectors drift |
| Selenium / Puppeteer DIY | 1–3 days dev | Partial — needs hardening | DIY | Free + infra | Continuous patching |
| Cloudflare-bypass SaaS | Hours | Yes, paid | No — raw HTML only | $50–200/mo + parser | Parser still on you |
| Manual copy-paste | 5–10 min per page | N/A | None | Free | Doesn't scale |
| Paid B2B data vendor | Days, NDA, contract | Yes | Yes | $500–5000/mo minimums | None, but expensive |
Why Pay-Per-Event Pricing?
Most scraper alternatives either charge a flat monthly subscription (you pay when you don't use it) or per-Compute-Unit (unpredictable). This actor uses pay-per-event pricing, which means:
- ✅ You pay only when the actor runs and only for what it actually delivers
- ✅ No monthly minimums, no seats, no contracts
- ✅ Transparent line-item billing inside the Apify console
- ✅ Easy to budget — a 100-listing test run costs cents
- ✅ Scale up to 50,000-listing daily sweeps without re-negotiating
- ✅ Free Plan compatible for evaluation
Changelog
| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-05 | Initial public release — Playwright Cloudflare bypass, German numeral/date parsing, vehicle + real-estate detail schemas, pay-per-event pricing |
Keywords
Kleinanzeigen scraper · Kleinanzeigen.de data · Kleinanzeigen API · Kleinanzeigen extractor · eBay Kleinanzeigen scraper · eBay Kleinanzeigen extractor · German classifieds API · German classifieds scraper · DE marketplace data · Germany used items data · German used items data · Kleinanzeigen price scraper · Kleinanzeigen lead generation · Kleinanzeigen seller scraper · Kleinanzeigen listings API · Kleinanzeigen monitoring · Kleinanzeigen alerts · Kleinanzeigen Autos scraper · Kleinanzeigen Immobilien scraper · Kleinanzeigen Wohnung scraper · Kleinanzeigen real estate data · Kleinanzeigen used car data · Kleinanzeigen Berlin scraper · Kleinanzeigen München scraper · Kleinanzeigen Hamburg scraper · Kleinanzeigen Köln scraper · Kleinanzeigen Frankfurt scraper · Kleinanzeigen Stuttgart scraper · Kleinanzeigen Düsseldorf scraper · Kleinanzeigen Leipzig scraper · Kleinanzeigen Privat seller filter · Kleinanzeigen Gewerblich seller scraper · Kaltmiete scraper · Wohnfläche extractor · Kilometerstand scraper · Erstzulassung scraper · second-hand market data Germany · used car price benchmarking Germany · German rental comps API · DACH marketplace intelligence · dropshipping research Germany · German reseller arbitrage data · Apify Kleinanzeigen actor · German consumer demand data · German brand monitoring · counterfeit detection Germany · price intelligence Kleinanzeigen · Cloudflare bypass scraper · Playwright Kleinanzeigen · Kleinanzeigen JSON API
Support
- 🐛 Bug reports: open an issue on the Apify Store page for this actor
- 💡 Feature requests: same place — describe your use case and the field you need
- 📧 Direct contact: through the Apify developer profile (haketa)
If this actor saves you time, a 5-star rating on the Apify Store helps other resellers, dealers, analysts and researchers discover it. Vielen Dank!