Kleinanzeigen.de Scraper icon

Kleinanzeigen.de Scraper

From $1/1K. Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller type, or search URL. Extract descriptions, photos, attributes,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Kleinanzeigen.de Scraper at a glance

Kleinanzeigen.de Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes ad id, change type (incremental mode), title, price and price (€), which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Lead Generation, Automation, Developer Tools
Region
Europe
Pricing
$1.70 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
29 options

From $1/1K. Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller type, or search URL. Extract descriptions, photos, attributes, seller details, posted dates, category paths, and imprint data. Returns flat JSON records ready for spreadsheets or databases.

What Kleinanzeigen.de Scraper can do

  • Two ways in. A filter builder (keyword, category id, location with radius, min/max price, offered vs wanted, private vs commercial, sort) or a paste-URL mode that accepts any Kleinanzeigen.de search or category URL.
  • Every category, not just one niche. The same filters and fields work whether you're tracking bicycles, cars, flats, electronics, jobs or collectibles.
  • Automatic forward pagination. 27 ads per page, walked until Kleinanzeigen.de's own real end of results or your page limit, whichever comes first.
  • About 40 fields per ad. Full description, all photo URLs, attribute key/value pairs, category path, seller name/type/registration date, and the commercial-seller legal imprint (name, address, email) when the seller is a registered trader.
  • A lean, cheaper mode. Turn off detail fetching for a lighter run that still returns about 14 fields straight from the search results.
  • Deduplicates promoted listings that repeat across result pages, so you don't pay for the same ad twice.

Choose what to collect

These inputs let you configure Kleinanzeigen.de Scraper - Ads, Prices & Seller Details. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredPick how you want to start: 'search' builds search URLs from the filter fields below, 'url' takes ready-made Kleinanzeigen.de search URLs you paste yourself.

Choices: search, url

keywordstringFree-text query, e.g. 'fahrrad', 'iphone 14', 'sofa'. Leave empty to browse a whole category.
categoryIdstringCategory name or numeric id. A name such as 'Fahrräder' or 'Elektronik' is matched against the site's own category tree (an unknown name stops the run with a clear error); a numeric id such as '217' (Fahrräder & Zubehör) or '161' (Elektronik) is used as is. Find ids in any category URL: .../c217. Leave empty to search all categories.
locationstringCity name or German postal code, e.g. 'Berlin', 'München', '10115'. Resolved automatically to the matching location id. Leave empty to search all of Germany.
radiusKmintegerSearch radius in kilometres around the chosen location. Ignored when no location is set. 0 = exact location only.
minPriceintegerLowest price to include. Leave empty for no lower bound.
maxPriceintegerHighest price to include. Leave empty for no upper bound.
Show 22 more inputs
More input fields
InputWhat it controls
offerTypestringLimit to ads offering something ('angebote') or wanted ads ('gesuche'). 'any' includes both.

Choices: any, angebote, gesuche

sellerTypestringLimit to private sellers ('privat') or commercial sellers/shops ('gewerblich'). 'any' includes both.

Choices: any, privat, gewerblich

zipCodesarraySearch several places in one run, one search per entry (postal codes such as '10115' or city names). When set it replaces the single Location field; the radius applies to each entry. Ads found by more than one entry are returned once.
minRoomsnumberFewest rooms. Works with categoryId 203 (Mietwohnungen), 196 (Eigentumswohnungen), 205 (Häuser zur Miete) or 208 (Häuser zum Kauf); any other category stops the run with a clear message. Search mode only; in URL mode paste a URL that already carries the filter.
maxRoomsnumberMost rooms. Same categories as Min rooms.
minAreaintegerSmallest living area in m². Same categories as Min rooms.
maxAreaintegerLargest living area in m². Same categories as Min rooms.
sortBystringResult ordering. Note: Kleinanzeigen shows promoted ads first regardless of sort.

Choices: relevance, date, price-asc, price-desc, distance

urlsarrayOne or more Kleinanzeigen.de URLs to scrape (used only when mode = url): search and category pages (keyword k0, category cNNN, keyword within category k0cNNN, location k0lr, price/offer/seller filters, sortingField sort, s-seite:N start page, also /s-/seite:N/cNNN), single ad pages (/s-anzeige/...) which return exactly that ad, seller listing pages (/s-bestandsliste.html?userId=...), commercial shop pages (/pro/, scraped through the shop's seller ad list), the legacy /s-suchanfrage.html?keywords= form and the m. mobile host. ebay-kleinanzeigen.de no longer exists and is skipped with a warning. The default list holds one example per shape.
maxPagesintegerHow many result pages to walk per search/URL (27 ads per page). 0 = unlimited (walk until the last page Kleinanzeigen serves for that search; Kleinanzeigen may itself cap a search around 50 pages, which is fine, the walk simply stops there).
maxListingsintegerStop after this many ads across all searches. 0 = unlimited (still bounded by maxPages).
fetchDetailsbooleanOpen every ad's detail page to pull the full description, all photos, attributes, seller info, view count, category path, and commercial-seller imprint. Turn off for a faster, cheaper run with just the search-result fields (~14 fields).
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue ONE interrupted full-catalogue walk across separate runs. Ads already collected there (matched by ad id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Distinct from 'Incremental mode' below, which tracks the SAME recurring search across many scheduled runs by itself.
incrementalModebooleanWhen ON, this actor remembers the ads from its own previous run of the SAME search (see 'State key' below) and tags every ad with a changeType: NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED. Use with the Apify Scheduler to monitor a search over time instead of re-scraping everything from scratch. Distinct from 'Resume from a previous run' above, which continues one specific interrupted run rather than tracking a recurring search. Default OFF, existing users/schedules are unaffected.
stateKeystringA name for this recurring search's saved state, e.g. 'berlin-fahrrad-watch'. Leave empty to auto-derive one from your search/filter settings (mode, keyword, category, location, radius, price, offer/seller type, sort, URLs, fetch details), two different filter setups never share a baseline. Set this explicitly if you want a stable name across input tweaks that shouldn't reset tracking, or to run several independent monitors from the same actor.
emitUnchangedbooleanWhen ON, ads with no detected change are still pushed to the dataset (tagged changeType=UNCHANGED) instead of being skipped. This returns, and BILLS, one extra row per unchanged ad every run. Default OFF: only NEW/UPDATED/REAPPEARED/EXPIRED ads are pushed.
recheckUnchangedAdsbooleanWith incremental mode and detail enrichment on, an ad that an earlier run already read in full and whose search-result card (title, price, location, category) is unchanged is NOT opened again. When ON, every ad page is opened every run so changes that exist only on the ad page (description, attributes, seller block) are detected. Slower and heavier per run. Default OFF.
emitExpiredbooleanWhen ON, ads tracked in a previous run but no longer found after a complete, uncapped scan are pushed once more tagged changeType=EXPIRED. This returns, and BILLS, one extra row per expired ad. Only fires on a run that reaches the real end of every tracked search (no resumeFromRunId, no maxListings/maxPages cap hit), a partial run never marks anything expired. Default OFF.
ignoreFieldsForChangesarrayField names that must NOT count as a change in incremental mode, e.g. description or imageUrls. A name matches at any depth; use a dotted path such as seller.name to target one nested field. Ignored fields stay in the output; they just never turn an ad into UPDATED or appear in changedFields. Already ignored by default: scrapedAt, searchUrl, viewCount, sellerOtherAdsCount, postedDateText, isTopAd, image resize parameters and the order of tags.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

adIdAd ID (text)
changeTypeChange type (incremental mode) (text)
titleTitle (text)
pricePrice (text)
priceAmountPrice (€) (number)
priceTypePrice type (text)
locationTextLocation (text)
postalCodeZIP (text)
cityNameCity (text)
categoryNameCategory (text)
categoryPathCategory path (text)
postedDatePosted (text)
Show 54 more fields
viewCountViews (number)
imageCountPhotos (number)
thumbnailUrlThumbnail (image)
sellerNameSeller (text)
sellerTypeSeller type (text)
isProPro/Shop (boolean)
urlURL (link)
changedFieldsChanged fields (incremental mode) (text)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
streetstreet
rentColdrentCold
purchasePricepurchasePrice
warmRentwarmRent
ancillaryCostsancillaryCosts
heatingCostsheatingCosts
depositdeposit
provisionprovision
roomsrooms
sleepingRoomssleepingRooms
bathroomsbathrooms
sizesize
lotArealotArea
floorfloor
numberOfFloorsnumberOfFloors
yearConstructedyearConstructed
flatTypeflatType
houseTypehouseType
vacantAtFromvacantAtFrom
balconybalcony
terraceterrace
fittedKitchenfittedKitchen
gardengarden
cellarcellar
elevatorelevator
garagegarage
guestWcguestWc
isFurnishedisFurnished
wgPossiblewgPossible
swapOfferswapOffer
bathtubbathtub
adStatusadStatus
sellerSatisfactionsellerSatisfaction
sellerFriendlinesssellerFriendliness
sellerReliabilitysellerReliability
descriptionFulldescriptionFull
imageUrlsimageUrls
attributesattributes
imprintimprint
sellerIdsellerId
sellerUrlsellerUrl (link)
sellerActiveSincesellerActiveSince
sellerBadgessellerBadges
sellerOtherAdsCountsellerOtherAdsCount (number)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "adId": "3400000001",
  "url": "https://www.kleinanzeigen.de/s-anzeige/sample-listing-title/3400000001-217-0001",
  "title": "Sample Listing Title",
  "descriptionShort": "First sentence of the ad as shown in the result list.",
  "descriptionFull": "Full ad description text appears here when fetchDetails is true.",
  "price": "1.500 € VB",
  "priceAmount": 1500,
  "priceType": "NEGOTIABLE",
  "currency": "EUR",
  "locationText": "10115 Berlin - Mitte",
  "postalCode": "10115",
  "regionName": "Berlin",
  "cityName": "Mitte",
  "latitude": 52.52,
  "longitude": 13.405,
  "categoryId": "217",
  "categoryName": "Fahrräder & Zubehör",
  "categoryPath": "Auto, Rad & Boot > Fahrräder & Zubehör",
  "categoryParentId": "210",
  "locationId": "3331",
  "postedDate": "2026-01-01",
  "postedDateText": "Heute, 09:00",
  "viewCount": null,
  "imageCount": 1,
  "thumbnailUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/00/00000000-0000-0000-0000-000000000000?rule=$_59.AUTO",
  "imageUrls": [
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/00/00000000-0000-0000-0000-000000000000?rule=$_59.AUTO"
  ],
  "attributes": {
    "Art": "Herren",
    "Typ": "Elektrofahrräder",
    "Zustand": "Sehr Gut"
  },
  "attributesRaw": [
    {
      "name": "Art",
      "value": "Herren"
    },
    {
      "name": "Typ",
      "value": "Elektrofahrräder"
    },
    {
      "name": "Zustand",
      "value": "Sehr Gut"
    }
  ],
  "isPro": false,
  "isShop": false,
  "isTopAd": false,
  "isSold": false,
  "adType": "OFFERED",
  "tags": [
    "Versand möglich"
  ],
  "sellerId": "100000000",
  "sellerName": "Sample Seller",
  "sellerType": "PRIVATE",
  "sellerUrl": "https://www.kleinanzeigen.de/s-bestandsliste.html?userId=100000000",
  "sellerActiveSince": "2026-01-01",
  "sellerOtherAdsCount": 4,
  "imprint": null,
  "searchUrl": "https://www.kleinanzeigen.de/s-fahrrad/k0",
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}

Ways to use this data

  • Resellers and classifieds arbitrage: watch a category and price band for underpriced items worth flipping.
  • Market and pricing research: build price distributions for a product type or city over time from real, live asking prices.
  • Property and rental scouting: monitor a city or postal code for new listings the moment they post.
  • Local lead generation: find people offering or seeking specific goods or services in a chosen city or radius.
  • Marketplace monitoring: schedule a saved search and get only new and changed ads each run with incremental mode.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Kleinanzeigen.de Scraper return?

The documented output for Kleinanzeigen.de Scraper includes ad id, change type (incremental mode), title, price, price (€), price type, location and zip. Availability of each field depends on the source page and the selected mode.

How much does Kleinanzeigen.de Scraper cost?

It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed ads on a schedule?

Yes. Schedule the actor from the Schedules tab with the same search or URLs and turn on Incremental mode. Each run then tags every ad NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED, and unchanged ads are not billed unless you turn emitUnchanged on.

What's the difference between "Resume from a previous run" and "Incremental mode"?

resumeFromRunId continues ONE specific interrupted run: paste its run or dataset id and this run only appends ads it hasn't already saved there. incrementalMode is for a recurring search you run again and again on a schedule; it remembers its own state between runs and classifies every ad as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. They solve different problems and can be combined for the first run of a new search, though the scheduled run right after that combined run reports the ads carried over from the resumed dataset as UPDATED once before tracking settles down.

Why did my run return 0 listings instead of failing?

An empty search is a legitimate outcome, not an error, so the run finishes successfully with a status message when the search page loaded but held no ads (usually filters that are too narrow). The run fails when no results page could be loaded at all (a connection problem, not an empty search), and in specific cases: an unreadable resumeFromRunId, or turning on incrementalMode together with resumeFromRunId when that search already has saved incremental state.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Kleinanzeigen.de Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.