Kleinanzeigen Scraper — German Classifieds & Real Estate avatar

Kleinanzeigen Scraper — German Classifieds & Real Estate

Pricing

from $1.20 / 1,000 results

Go to Apify Store
Kleinanzeigen Scraper — German Classifieds & Real Estate

Kleinanzeigen Scraper — German Classifieds & Real Estate

Scrape any listing from Kleinanzeigen.de, Germany's largest classifieds site — cars, electronics, furniture, collectibles — plus apartments, houses, land and commercial property. Structured price and price type, postcode and city, photos, publish date and full descriptions.

Pricing

from $1.20 / 1,000 results

Rating

0.0

(0)

Developer

Unfenced Group

Unfenced Group

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Kleinanzeigen Scraper

Extract listings from kleinanzeigen.de at scale, in a clean and consistent structure ready for price monitoring, market analysis, valuation models and lead generation. Covers the whole site — cars, electronics, furniture, collectibles — plus dedicated categories for apartments, houses, land and commercial property. No API key required.


Why this scraper?

🎯 Built for Germany

A dedicated German scraper, not a global tool with a country dropdown. German price conventions, postcodes and location names are handled natively, and locations resolve against Kleinanzeigen's own list rather than a guessed city name.

💶 German price conventions, kept apart

A fixed price, a negotiable price (VB, Verhandlungsbasis), a VB with no number at all, a giveaway and a swap-only ad are five different things. Every record carries a priceType that says which, so a negotiable asking price is never mistaken for a fixed one and a listing with no price is never mistaken for a free one.

📍 Real location filtering

Pass a city or district name and it is resolved to the location the site actually filters on, so "Berlin" returns Berlin listings rather than every listing in Germany that mentions Berlin.

🏠 Property characteristics

Living area, room count and the listing's own tag line in structured fields, for the real-estate categories.

📄 Full descriptions on demand

Search pages carry a truncated snippet. Turn on Fetch listing details and every record gets the complete description, the publish date, the full photo gallery and the listing's attribute table.

🛡️ It tells you when it breaks

If the source changes its markup, this actor fails loudly with a PARSER_STALE health signal instead of quietly returning zero rows. A scheduled feed that silently goes empty is worse than one that stops.


Input parameters

ParameterTypeDefaultDescription
propertyCategorystring"apartment_sale"Which part of the site to search. One of apartment_sale, house_sale, apartment_rent, house_rent, land, commercial, all (all real estate), all_classifieds (whole site).
searchQuerystring""Free-text search term, e.g. Altbau or Pokemon. Empty returns everything in the category.
locationstring""City, district or region, e.g. Berlin, München, Hamburg Altona. Resolved against Kleinanzeigen's own location list. A location code such as 3331 also works. Empty searches all of Germany.
minPriceinteger(empty)Lowest price in euros. Applied in the search URL and to the parsed price.
maxPriceinteger(empty)Highest price in euros. Listings with no price are never removed by this filter.
daysOldinteger(empty)Only return listings published within this many days. See the limitation note below.
fetchDetailsbooleanfalseOpen each listing's own page for the full description, publish date, gallery, region and attribute table.
maxItemsinteger100Maximum listings to return.
startUrlsarray[]Kleinanzeigen search URLs to scrape directly. When set, the category, query, location and price inputs are ignored.
proxyConfigurationobject{"useApifyProxy": true}Proxy used for requests. The site rate-limits repeat requests from one IP, so the default is recommended. Residential proxy is not needed.

Output schema

Every field below is present on every record. Fields the source does not publish for a given listing are returned as null rather than omitted.

Always present

FieldTypeDescription
idstringThe listing's Kleinanzeigen ad ID.
urlstringDirect link to the listing.
titlestringListing title as published.
priceTextstringThe price exactly as displayed, e.g. "4.999 € VB". null when the listing shows no price.
priceAmountnumberPrice as a number in euros. null for a bare VB or a swap ad; 0 for a giveaway.
priceTypestringfixed, negotiable (VB), free (Zu verschenken), trade (Tauschen), or none when no price is published.
priceCurrencystring"EUR", or null when there is no price.
postcodestringFive-digit German postcode.
citystringCity or district as published.
statestringFederal state. Only populated with fetchDetails: true.
countrystringAlways "DE".
areaM2numberLiving area in m². Real estate only; null elsewhere.
roomsnumberRoom count. Real estate only; null elsewhere.
tagsarrayThe listing's own tag line, split into parts, e.g. ["135 m²", "4 Zi.", "Online-Besichtigung"].
sellerNamestringName of the commercial seller, when the card shows one. null for private sellers.
sellerTypestringcommercial, private, or null when the card carries no seller badge.
shippingAvailablebooleanWhether the ad offers shipping (Versand möglich).
isTopAdbooleanWhether the listing was placed as a paid TOP ad.
imagesarrayPhoto URLs. One preview image from the search page; the full gallery with fetchDetails: true.
imageCountnumberNumber of photos on the listing.
descriptionHtmlstringAlways null — the source publishes descriptions as plain text.
descriptionTextstringDescription. A truncated snippet from the search page unless fetchDetails is on.
descriptionMarkdownstringSame content as descriptionText.
descriptionTruncatedbooleantrue when the description is the shortened search-page snippet.
publishDatestringPublish date as YYYY-MM-DD. See the limitation note below.
publishDateISOstringSame value as publishDate.
publishTimeLocalstringPublish time in German local time, e.g. "15:53", when the card shows one.
attributesobjectThe listing's attribute table. Populated with fetchDetails: true.
categorystringThe propertyCategory value the run used.
transactionstringrent or sale for real-estate categories; null otherwise.
propertyTypestringWohnung, Haus, Grundstück or Gewerbeimmobilie for real-estate categories; null otherwise.
sourcestringAlways "kleinanzeigen.de".
scrapedAtstringISO timestamp of when the record was scraped.
contentHashstringStable 16-character hash of ID and title, identical whether or not detail fetching ran.

Populated only with fetchDetails: true

state, attributes, the full images gallery, the complete descriptionText / descriptionMarkdown, and publishDate for real-estate listings.

Example record

{
"id": "3502152671",
"url": "https://www.kleinanzeigen.de/s-anzeige/4-zimmer-wohnung-mit-46-m-dachterrasse-stellplatz-neubau/3502152671-203-3436",
"title": "4-Zimmer-Wohnung mit 46 m² Dachterrasse & Stellplatz, Neubau",
"priceText": "2.100 €",
"priceAmount": 2100,
"priceType": "fixed",
"priceCurrency": "EUR",
"postcode": "13587",
"city": "Spandau",
"state": "Berlin",
"country": "DE",
"areaM2": 135,
"rooms": 4,
"tags": ["135 m²", "4 Zi.", "Online-Besichtigung"],
"sellerName": null,
"sellerType": "private",
"shippingAvailable": false,
"isTopAd": true,
"images": [
"https://img.kleinanzeigen.de/api/v1/prod-ads/images/11/11b40bd2-7691-42fb-abd6-d77d565354aa?rule=$_59.AUTO"
],
"imageCount": 15,
"descriptionHtml": null,
"descriptionText": "Vollständig teilmöblierte 4-Zimmer-Wohnung in einer der neun Stadtvillen des 2023 fertiggestellten Quartiers, mit 46 m² Dachterrasse und eigenem Stellplatz.",
"descriptionMarkdown": "Vollständig teilmöblierte 4-Zimmer-Wohnung in einer der neun Stadtvillen des 2023 fertiggestellten Quartiers, mit 46 m² Dachterrasse und eigenem Stellplatz.",
"descriptionTruncated": false,
"publishDate": "2026-09-05",
"publishDateISO": "2026-09-05",
"publishTimeLocal": null,
"attributes": {
"Wohnfläche": "135 m²",
"Zimmer": "4",
"Etage": "2",
"Verfügbar ab": "Oktober 2026"
},
"category": "apartment_rent",
"transaction": "rent",
"propertyType": "Wohnung",
"source": "kleinanzeigen.de",
"scrapedAt": "2026-09-07T14:04:26.631Z",
"contentHash": "5c9b1a4b6f41294e"
}

Examples

Apartments for rent in Berlin:

{
"propertyCategory": "apartment_rent",
"location": "Berlin",
"maxItems": 200
}

Rentals in Munich under €1,500, with full descriptions:

{
"propertyCategory": "apartment_rent",
"location": "München",
"maxPrice": 1500,
"fetchDetails": true,
"maxItems": 100
}

Scrape a specific search URL:

{
"startUrls": [
{ "url": "https://www.kleinanzeigen.de/s-wohnung-kaufen/berlin/c196l3331" }
],
"maxItems": 200
}

Daily feed of yesterday's classifieds (run on a schedule):

{
"propertyCategory": "all_classifieds",
"searchQuery": "Pokemon",
"daysOld": 1,
"maxItems": 500
}

Schedule this input to run once a day in the Apify Scheduler — each run returns only listings added in the last 24 hours.


💰 Pricing

$1.50 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.

ResultsCost
100~$0.15
1,000~$1.50
10,000~$15.00
100,000~$150.00

Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $0.90 per 1,000 at the highest tier. Use the Max items cap in the input to control your spend exactly.


Performance

Run sizeTypical time
100 resultsunder 1 minute
1,000 results2–4 minutes
10,000 results20–35 minutes

With fetchDetails: true, expect roughly double these times — one extra request per listing.


Known limitations

  • Kleinanzeigen shows a publish date on general classifieds cards but not on real-estate cards. For real estate, publishDate and the daysOld filter need fetchDetails: true.
  • Search-page descriptions are truncated by the source. Turn on fetchDetails for the full text.
  • Living area and room count come from the listing's own tag line and are null when the lister did not publish them.
  • Inside a real-estate category the site ignores a search term it cannot match and returns the whole category rather than an empty result.
  • The site rate-limits repeat requests from one IP. The actor retries with a fresh proxy session, which is why a run can pause briefly between pages.
  • Listings can be withdrawn at any time, so a small share of URLs may expire shortly after scraping.

Technical details

  • Source: kleinanzeigen.de — German classifieds, including the full real-estate section
  • Coverage: everything the public search exposes, filterable via the input parameters above
  • Retry: automatic retry with exponential backoff and a fresh proxy session per attempt
  • Health signal: every run writes a HEALTH record — OK, ZERO_RESULTS for a search the source confirms is empty, or PARSER_STALE when a healthy page yields no listings and does not report itself empty

Rate this actor

If this scraper does its job, a short review on the Reviews tab helps other users find it. Something not working? Open an issue on the Issues tab instead — issues get fixed.


Need a custom scraper?

Unfenced Group builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

Get in touch: www.unfencedgroup.nl