Kleinanzeigen.de Scraper avatar

Kleinanzeigen.de Scraper

Pricing

from $3.50 / 1,000 results

Go to Apify Store
Kleinanzeigen.de Scraper

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

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.

Apify Actor


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 (VB negotiable / Festpreis fixed / Zu verschenken free), 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 (Privat private / Gewerblich commercial), member-since date and rating where displayed
  • RecencypostedDate normalized from German natural-language ("Heute", "Gestern", "vor 3 Tagen", "28.04.2026") to ISO YYYY-MM-DD
  • Media — primary image plus the full image gallery from the detail page
  • Engagement — view count when scraped with details
  • Vehicle-specific (category c216 Autos and adjacent) — Kilometerstand, Erstzulassung, Kraftstoff, Getriebe, Leistung (PS/kW), Fahrzeugtyp, Hubraum
  • Real-estate-specific (categories c195 Mietwohnungen, c196 Eigentumswohnungen and adjacent) — Wohnfläche, Zimmer, Kaltmiete, Nebenkosten, Etage, Verfügbar ab
  • MetadatascrapedAt ISO 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 formats1.990,50 is not "1990.50"; Heute, Gestern, vor 5 Tagen need 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/Erstzulassung table; apartments have Wohnfläche/Kaltmiete; you need per-category logic
  • Pagination via URL slugs (/seite:2, /seite:3 …) rather than query params
  • Mixed seller signalsPrivat vs Gewerblich is inferred from badge text, /pro/ URL slugs and account hints
  • Image lazy-loading — first-page images are placeholders; the real data-imgsrc only 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

  1. Open the actor page on Apify Store and click "Try for free"
  2. 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)
  3. Toggle Scrape Detail Pages on for the full schema including vehicle/real-estate fields and seller info
  4. 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 ApifyClient
client = 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

PatternExamplePurpose
/s-{category}/c{categoryId}/s-autos/c216Browse by top-level category
/s-{location}/{keyword}/k0l{locationId}/s-muenchen/iphone/k0l5941Keyword search within a city
/s-{keyword}/k0/s-sofa/k0Nationwide keyword search
/{baseUrl}/seite:{page}/s-autos/c216/seite:3Pagination — page 1 is the bare URL
/s-anzeige/{slug}/{id}-{cat}-{loc}/s-anzeige/bmw-320d/2123456789-216-5941Detail page for a single listing

Engineering pipeline

  • Headed Chromium via Playwright — bypasses Cloudflare's JS challenge without a proxy in 90%+ of runs
  • navigator.webdriver patch + window.chrome stub — removes the most-fingerprinted automation signal
  • de-DE locale + 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 human to 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.5 and strips VB / Festpreis / Zu verschenken markers
  • German date parserHeute / Gestern / vor N Tagen / DD.MM.YYYY → ISO YYYY-MM-DD
  • Category-aware detail parser — walks [id*="viewad-details"] li and 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:
    1. .addetailslist--detail class blocks (the current default markup)
    2. <li> "Label: Value" / "Label – Value" text parsing
    3. <dl><dt> / <dd> definition lists
    4. Table <tr> key/value rows
    5. 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's tel: 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:N up to maxPages (default 10)
  • JSON-LD fallback — when Product / Car / Apartment schema 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

ParameterTypeDefaultDescription
searchUrlsarray<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.
keywordstring""Search term used when no searchUrls are supplied. Examples: iphone, bmw 320d, wohnung, sofa, playstation 5, kinderwagen. URL-encoded automatically.
locationstring""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.
scrapeDetailsbooleanfalseWhen 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.
maxListingsinteger100Hard cap on total listings written to the dataset. 0 = unlimited. Use a small value (10-50) when testing.
maxPagesinteger10Maximum search-result pages to walk per task. Each page returns ~25 listings.
requestDelayinteger (ms)2000Pause between consecutive requests. Random jitter up to 500 ms is added on top to look more human. Range: 0–15000.
proxyConfigurationobject{ "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)

FieldTypeDescription
listingIdstringKleinanzeigen data-adid — unique per listing
titlestringListing headline as shown on the card
pricenumberNumeric EUR price (parsed from German format, 1.990,50 €1990.5)
priceTypestringOne of VB (Verhandlungsbasis / negotiable), Festpreis (fixed), Zu verschenken (free)
currencystringAlways EUR when a price is present
categorystringCategory name from the card tag or breadcrumb (e.g. Wohnungen, Smartphones, Damenkleidung)
conditionstringNeu, Gebraucht, Defekt, Generalüberholt — populated from detail page
locationstringRaw city/region string as shown (e.g. 10115 Berlin, 80331 München)
postalCodestring5-digit PLZ extracted from the location string
postedDatestringISO YYYY-MM-DD parsed from German natural language
listingUrlstringCanonical detail-page URL
imageUrlstringPrimary image URL
imagesarray<string>Full image gallery (detail-page enrichment)
scrapedAtstringISO-8601 timestamp of extraction

Seller fields (populated when detail-page enrichment is on)

FieldTypeLive coverageDescription
sellerNamestring~90–100%Display name on the user profile widget
sellerTypestring~90–100%Privat or Gewerblich — inferred from badges and /pro/ URLs
sellerRatingstringsparseReputation indicator where shown
sellerMemberSincestring~90–100%Account-creation indicator (e.g. März 2018, 2019)
descriptionstring~90–100%Full listing description (truncated to 2000 chars)
viewCountnumber100%Detail-page view count published by Kleinanzeigen
phonestring~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.
conditionstring~90%Neu, Gebraucht, Defekt, Generalüberholt
imagesarray<string>~90–100%Full image gallery from the detail page
postedDatestring~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.

FieldGerman labelLive coverageDescription
kilometerstandKilometerstand / Laufleistung~90%Odometer in km (number)
erstzulassungErstzulassung / EZ / Baujahr~90%First-registration month/year (e.g. 06/2018)
kraftstoffKraftstoff / Antrieb~90%Benzin, Diesel, Elektro, Hybrid, LPG, CNG
getriebeGetriebe / Schaltung~90%Schaltgetriebe, Automatik, Halbautomatik
leistungLeistung (PS / kW)~90%Engine output
fahrzeugtypFahrzeugtyp / Karosserie~90%Limousine, Kombi, SUV, Coupé, Cabrio, Van, Kleinwagen
hubraumHubraum (ccm)populated where shownEngine displacement

Real-estate fields (Wohnung / Haus categories)

FieldGerman labelDescription
wohnflaecheWohnflächeLiving area in m²
zimmerZimmer / RäumeRoom count (number)
kaltmieteKaltmiete / NettomieteBase rent in EUR excluding utilities (number)
nebenkostenNebenkosten / BetriebskostenMonthly utilities in EUR (number)
etageEtage / Stockwerk / GeschossFloor
verfuegbarAbVerfügbar ab / Bezugsfrei abMove-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)

ValueGerman MeaningBuyer Interpretation
VBVerhandlungsbasisNegotiable — seller open to offers, price is a starting point
FestpreisFixed priceTake it or leave it — no haggling expected
Zu verschenkenFree / giftItem is free; pickup arranged
nullNot statedSeller did not mark a price type; treat raw price as nominal

Seller types (sellerType field)

ValueGerman MeaningImplication
PrivatPrivate individualConsumer-to-consumer sale, no warranty, no VAT invoice
GewerblichCommercial / businessDealer, shop or registered trader; warranty and VAT invoice apply under German law
nullUnknownDetail page not scraped or badge missing

Condition (condition field)

ValueGerman Meaning
NeuNew, unused
GebrauchtUsed
DefektDefective / for parts
GeneralüberholtRefurbished / 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 Privat only 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 verschenken items 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 + price lets 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) with postedDate to 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 listingId sets

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 scrapedAt timestamps 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 pro drops 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 vermieten to pitch property-management SaaS, insurance, vetting tools
  • Identify tradespeople in Handwerk & Hausbau for 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)

  1. Schedule the actor in Apify (e.g. every weekday at 07:00 Berlin time) with a fixed searchUrls list per market
  2. Attach the "Export to Google Sheets" integration to that schedule
  3. 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 Submariner under €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:

MetroBundeslandSlugWhy It Matters
BerlinBerlinberlinCapital, ~3.7M people, largest listing volume, dense rental market
MünchenBayernmuenchenHighest rents in Germany, premium used-car market
HamburgHamburghamburgMaritime hub, strong second-hand furniture & maritime gear
KölnNordrhein-WestfalenkoelnRhineland economic centre, dense student rental market
Frankfurt am MainHessenfrankfurt-am-mainFinancial capital, expat-driven listings
DüsseldorfNordrhein-WestfalenduesseldorfFashion & retail capital, premium-goods resale
StuttgartBaden-WürttembergstuttgartAutomotive heartland — exceptional used-car depth
LeipzigSachsenleipzigFastest-growing East German metro, affordable rentals
Dortmund / EssenNordrhein-Westfalendortmund / essenRuhr area, household goods & DIY
Dresden / HannoverSachsen / Niedersachsendresden / hannoverEastern & central trade hubs
Nürnberg / BremenBayern / Bremennuernberg / bremenFranconian + 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 NameEnglishCategory ID
AutosCarsc216
Wohnung mieten / kaufenApartments rent / buyc203 / c196
Haus mieten / kaufenHouses rent / buyc200 / c208
ElektronikElectronicsc161
Handy & TelefonPhonesc173
Mode & BeautyFashion & beautyc153
Möbel & WohnenFurniture & homec192
Familie, Kind & BabyFamily, kids & babyc17
Sport & HobbySport & hobbyc139
Jobs / DienstleistungenJobs / servicesc102 / c269
TicketsTicketsc225
Zu verschenkenFree / giveawayvaries

Cost & Performance

MetricValue
EnginePlaywright (Chromium, headed) with anti-detection patches
Anti-botBuilt-in Cloudflare challenge wait loop
Runtime — list pages only (100 listings)~1–2 minutes
Runtime — list + detail enrichment (100 listings)~6–10 minutes
Cost modelPay-per-event — pay only for what you scrape
Data freshnessLive at run time — kleinanzeigen.de doesn't publish historical dumps
Auth requiredNone
Proxy requiredNo — Playwright headed mode handles Cloudflare; Apify Residential available as fallback
ConcurrencySafe to run multiple parallel tasks across different categories/cities
Memory footprint1024 MB minimum (Playwright + Chromium), 4096 MB recommended for large detail runs
DedupBuilt-in by listingId / URL across pages

Tip: For the cheapest run, set scrapeDetails: false and use a tight maxListings. Detail enrichment is the single biggest cost multiplier — turn it on only when you need vehicle/property/seller fields.


  • 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.


If you need classifieds and marketplace data from other countries, check these sibling actors:


Comparison vs. Alternatives

ApproachSetup timeCloudflare handlingSchema normalizationCost (1k detail listings)Maintenance burden
This actor< 2 minutesBuilt-in (Playwright headed)Built-in (German numerals, dates, categories)PenniesNone
requests + BeautifulSoup4–8 hours devBlocked immediatelyDIYFree + dev costConstant — selectors drift
Selenium / Puppeteer DIY1–3 days devPartial — needs hardeningDIYFree + infraContinuous patching
Cloudflare-bypass SaaSHoursYes, paidNo — raw HTML only$50–200/mo + parserParser still on you
Manual copy-paste5–10 min per pageN/ANoneFreeDoesn't scale
Paid B2B data vendorDays, NDA, contractYesYes$500–5000/mo minimumsNone, 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

VersionDateNotes
1.02026-05Initial 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!