Kleinanzeigen Scraper — German Classifieds & Real Estate
Pricing
from $1.20 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share

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
| Parameter | Type | Default | Description |
|---|---|---|---|
propertyCategory | string | "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). |
searchQuery | string | "" | Free-text search term, e.g. Altbau or Pokemon. Empty returns everything in the category. |
location | string | "" | 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. |
minPrice | integer | (empty) | Lowest price in euros. Applied in the search URL and to the parsed price. |
maxPrice | integer | (empty) | Highest price in euros. Listings with no price are never removed by this filter. |
daysOld | integer | (empty) | Only return listings published within this many days. See the limitation note below. |
fetchDetails | boolean | false | Open each listing's own page for the full description, publish date, gallery, region and attribute table. |
maxItems | integer | 100 | Maximum listings to return. |
startUrls | array | [] | Kleinanzeigen search URLs to scrape directly. When set, the category, query, location and price inputs are ignored. |
proxyConfiguration | object | {"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
| Field | Type | Description |
|---|---|---|
id | string | The listing's Kleinanzeigen ad ID. |
url | string | Direct link to the listing. |
title | string | Listing title as published. |
priceText | string | The price exactly as displayed, e.g. "4.999 € VB". null when the listing shows no price. |
priceAmount | number | Price as a number in euros. null for a bare VB or a swap ad; 0 for a giveaway. |
priceType | string | fixed, negotiable (VB), free (Zu verschenken), trade (Tauschen), or none when no price is published. |
priceCurrency | string | "EUR", or null when there is no price. |
postcode | string | Five-digit German postcode. |
city | string | City or district as published. |
state | string | Federal state. Only populated with fetchDetails: true. |
country | string | Always "DE". |
areaM2 | number | Living area in m². Real estate only; null elsewhere. |
rooms | number | Room count. Real estate only; null elsewhere. |
tags | array | The listing's own tag line, split into parts, e.g. ["135 m²", "4 Zi.", "Online-Besichtigung"]. |
sellerName | string | Name of the commercial seller, when the card shows one. null for private sellers. |
sellerType | string | commercial, private, or null when the card carries no seller badge. |
shippingAvailable | boolean | Whether the ad offers shipping (Versand möglich). |
isTopAd | boolean | Whether the listing was placed as a paid TOP ad. |
images | array | Photo URLs. One preview image from the search page; the full gallery with fetchDetails: true. |
imageCount | number | Number of photos on the listing. |
descriptionHtml | string | Always null — the source publishes descriptions as plain text. |
descriptionText | string | Description. A truncated snippet from the search page unless fetchDetails is on. |
descriptionMarkdown | string | Same content as descriptionText. |
descriptionTruncated | boolean | true when the description is the shortened search-page snippet. |
publishDate | string | Publish date as YYYY-MM-DD. See the limitation note below. |
publishDateISO | string | Same value as publishDate. |
publishTimeLocal | string | Publish time in German local time, e.g. "15:53", when the card shows one. |
attributes | object | The listing's attribute table. Populated with fetchDetails: true. |
category | string | The propertyCategory value the run used. |
transaction | string | rent or sale for real-estate categories; null otherwise. |
propertyType | string | Wohnung, Haus, Grundstück or Gewerbeimmobilie for real-estate categories; null otherwise. |
source | string | Always "kleinanzeigen.de". |
scrapedAt | string | ISO timestamp of when the record was scraped. |
contentHash | string | Stable 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.
| Results | Cost |
|---|---|
| 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 size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–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,
publishDateand thedaysOldfilter needfetchDetails: true. - Search-page descriptions are truncated by the source. Turn on
fetchDetailsfor the full text. - Living area and room count come from the listing's own tag line and are
nullwhen 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
HEALTHrecord —OK,ZERO_RESULTSfor a search the source confirms is empty, orPARSER_STALEwhen 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