Scrape Kleinanzeigen.de listings as clean JSON - titles, prices, specs, locations, images and dates. GDPR-clean by design: no seller names, IDs or contact data, ever. Splits big searches past the 1,250-result cap, flags wanted ads, optional full descriptions. Pay per result.
$1.99 / 1,000 · 93.4% success over 1,451 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
searchQuery |
string | Free-text search, e.g. e-bike. Provide this, a category, or both. |
e-bike |
categoryId |
integer | Numeric Kleinanzeigen category ID to scope the crawl, e.g. 217 for Fahrräder. Category IDs appear in the site's URLs as c217. Optional. |
- |
location |
string | German city or region to search in, e.g. "Berlin" or "München" - resolved via the site's own location search. Combine with radiusKm for a radius search. | - |
radiusKm |
integer | Only return listings within this many km of the location. Requires location. | - |
priceMinEur |
integer | Only return listings priced at or above this amount. Optional. | - |
priceMaxEur |
integer | Only return listings priced at or below this amount. Optional. | - |
sortBy |
string | Newest first is the default and the right choice for monitoring; price ascending surfaces the cheapest offers first. | date |
postedAfter |
string | Only keep listings posted on or after this date (YYYY-MM-DD or ISO timestamp). Listings whose posting date cannot be read are excluded when a window is set. | - |
postedBefore |
string | Only keep listings posted on or before this date (YYYY-MM-DD or ISO timestamp). | - |
sellerType |
string | Only private sellers, only business sellers, or both. | any |
scrapeDetails |
boolean | Fetch each listing's detail page for the full description and category specs (condition, brand, car mileage, property size, ...). One extra request per listing, so noticeably slower — but much richer output. | False |
maxItems |
integer | Stop after this many listings. | 1000 |
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
| Field | Type | Meaning |
|---|---|---|
listingId |
string | Kleinanzeigen ad ID. |
title |
string | Listing title as posted. |
description |
string | Listing description: the search snippet by default, the full text when scrapeDetails is enabled. |
priceCents |
integer | Asking price in euro cents. 0 for giveaways ('Zu verschenken'); absent when the listing shows no amount. |
priceType |
string | FIXED for a plain price, NEGOTIABLE when marked 'VB' (Verhandlungsbasis), GIVEAWAY for 'Zu verschenken'. |
location |
string | Area-level location as the marketplace displays it: postcode and district, not a seller address. |
postedAt |
string | Posting date as displayed: a date, or a relative label like 'Heute, 09:12' (today) or 'Gestern' (yesterday). |
imageUrl |
string | URL of the listing's first image, when present. |
url |
string | Direct link to the listing. |
adType |
string | 'offer' for items for sale; 'wanted' for Gesuch ads (someone searching, not selling) — exclude those from price analysis. |
shippingPossible |
boolean | Whether the listing is tagged 'Versand möglich' (shipping available). |
attributes |
object | Whitelisted, non-personal listing specs from the detail page (requires scrapeDetails): condition, brand, color, size for goods; mileage, firstRegistration, fuel, transmission, power for cars; livingArea, rooms for property — when the listing has them. |
sellerType |
string | Whether the ad comes from a private or business seller (detected with scrapeDetails, or implied by the sellerType input filter). The only seller-related field in the output. |
postedDate |
string | Posting date normalized to YYYY-MM-DD (from the site's display date). |
93.4% success over 1,451 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.