Kleinanzeigen.de Scraper
Pricing
from $1.59 / 1,000 results
Kleinanzeigen.de Scraper
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.
Pricing
from $1.59 / 1,000 results
Rating
0.0
(0)
Developer
Lowland Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Kleinanzeigen.de Scraper — GDPR-safe listings data
Extract listings from Kleinanzeigen.de (formerly eBay Kleinanzeigen) — Germany's largest classifieds marketplace — as clean, structured JSON. Prices, descriptions, categories, specs, locations, images and posting dates, ready for price monitoring, market research and data pipelines.
No seller personal data, ever. This scraper is built GDPR-first: seller names, IDs, phone numbers and profile links never appear in the output — not as an option you have to remember to switch off, but by design. The only seller information included is whether the ad comes from a business or a private seller.
Quick start (30 seconds)
- Put what you'd type in the Kleinanzeigen search box into searchQuery — e.g.
e-bike. - Click Start. That's the whole minimum setup.
- When the run finishes, open the dataset's Overview tab for a clean table, or Export it as CSV/Excel/JSON.
Everything else — price range, category, seller type, full-description enrichment — is an optional refinement, explained in the Input table below. To make it run by itself, create a Schedule in the Apify Console with the same input and add an email or Slack integration on the runs.
What you can build with it
- Catch underpriced deals the minute they post. Sort by date, watch a category, and every new ad arrives parsed — price, negotiability and shipping flag included — while the deal is still live.
- Price a used car with real market data. Pull every BMW 3er in your price band with full specs (
mileage,firstRegistration,fuel,transmission) and build the price-vs-mileage curve that tells you what a fair offer is. - Track a market week over week. Snapshot "E-Bikes unter 1.500 €" on a schedule and watch supply, median asking price and negotiation room (
NEGOTIABLEshare) shift over time. - Feed an AI agent clean data. Structured, predictable fields with zero personal data — an assistant or pipeline can store and process it without a compliance review first.
What you get
Each listing is one dataset item:
{"listingId": "3255625724","title": "KTM Macina Style 710 E-Bike Damen Trekking","description": "Sehr gut erhaltenes E-Bike, Akku 750 Wh, Bosch Performance Line...","priceCents": 329900,"priceType": "NEGOTIABLE","location": "10115 Berlin Mitte","postedAt": "Heute, 09:12","imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/...","url": "https://www.kleinanzeigen.de/s-anzeige/...","adType": "offer","shippingPossible": true,"attributes": { "condition": "Sehr Gut", "brand": "KTM", "color": "Schwarz" },"sellerType": "private"}
Field notes, so you know exactly what you are buying:
priceCentsis the asking price in euro cents.priceTypetells you how to read it:FIXED,NEGOTIABLE(the German "VB" — open to offers) orGIVEAWAY("Zu verschenken").adTypeseparates real offers fromwantedads ("Gesuch" — someone looking for an item). Filter on it before doing any price analysis; raw scrapers that skip this quietly pollute your data with wish-list prices.locationis the area-level postcode + district the marketplace displays — not a seller address.postedAtis the posting date exactly as displayed — a date, orHeute/Gesternlabels for recent ads.attributesare the whitelisted, non-personal specs from the detail page (with Scrape full descriptions on): condition, brand, color and size for goods; mileage, first registration, fuel, transmission and power for cars; living area and rooms for property.descriptionis the search snippet by default and the full listing text with Scrape full descriptions on.
How much does it cost to scrape Kleinanzeigen?
$1.99 per 1,000 listings delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain dollars:
- 100 listings ≈ $0.20 — a daily category watch.
- 500 listings ≈ $1.00 — a solid market snapshot, full descriptions included with
scrapeDetails. - A 1,000-listing crawl ≈ $2 — a whole search neighbourhood.
The per-result price is all-inclusive — no separate platform-usage charges, even with scrapeDetails enabled. Higher Apify plans get automatic unit-price discounts (down to $1.59/1,000 on Gold). Free-plan runs are limited to a sample of 25 items, enough to evaluate the output format against your real query.
Not technical? Let your AI assistant set it up
Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:
Help me set up the "Kleinanzeigen.de Scraper" actor on Apify(https://apify.com/lowlanddata/kleinanzeigen-scraper). Guide me one step at a time.What I want to watch: [E.G. "e-bikes between 500 and 5000 EUR, alert me on new ads"]Guide me to:1. Propose my input values: searchQuery (what I'd type in the Kleinanzeigen searchbox, German terms work best), optional priceMinEur/priceMaxEur, optional location + radiusKm forlistings near a city (e.g. "München" + 10), sortBy "date"for newest-first monitoring, sellerType if I only want private or business ads,scrapeDetails true if I want full descriptions and specs, and maxItems.2. If my watch fits one category: browse kleinanzeigen.de to that category and readthe number from the URL (/s-fahrraeder/c217 means categoryId 217), then add it.3. Create a free Apify account (apify.com), open the actor page, paste the valuesinto the Input form, and start a run.4. Set up a daily Schedule in the Apify Console with the same input, plus an emailor Slack integration so new results reach me automatically.5. Show me how to export results as CSV/Excel, or read them from the API if I code.
Input
| Field | Description |
|---|---|
searchQuery | Free-text search, e.g. e-bike. Provide this, a category, or both. |
categoryId | Numeric category ID (the c217-style number in the site's URLs) to scope the crawl. |
location / radiusKm | Radius search: a German city or region name (e.g. München) plus a radius in km — resolved via the site's own location search. |
priceMinEur / priceMaxEur | Only listings within this price range, in EUR. |
sortBy | date (newest first, default) or price_asc (cheapest first). |
sellerType | any (default), private, or business. |
scrapeDetails | Fetch each listing's page for the full description + specs. Slower, richer. |
maxItems | Stop after this many listings. Default 1,000. |
A run needs at least a search query or a category — the actor tells you so up front instead of returning an empty dataset.
Finding a category ID
Browse Kleinanzeigen to the category you want and read the number from the URL: /s-fahrraeder/c217 → 217. Every category and subcategory has one.
Use it from your code
Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):
curl "https://api.apify.com/v2/acts/lowlanddata~kleinanzeigen-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-X POST -H "Content-Type: application/json" \-d '{"searchQuery": "e-bike", "maxItems": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('lowlanddata/kleinanzeigen-scraper').call({searchQuery: 'e-bike',maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("lowlanddata/kleinanzeigen-scraper").call(run_input={"searchQuery": "e-bike", "maxItems": 100})items = client.dataset(run["defaultDatasetId"]).list_items().items
Schedules (e.g. a daily price snapshot), webhooks and the Make/Zapier/n8n integrations all work out of the box — this is a standard Apify actor.
Use it with AI agents (MCP)
Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results — no glue code.
Claude Code:
$claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/kleinanzeigen-scraper"
Cursor or Claude Desktop (add a custom connector / MCP server with this URL):
https://mcp.apify.com?actors=lowlanddata/kleinanzeigen-scraper
Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: Apify MCP docs, or start from this actor's own MCP page: apify.com/lowlanddata/kleinanzeigen-scraper/api/mcp.
Prompts that work once connected:
- "Find the 20 newest e-bike listings between €500 and €2000 on Kleinanzeigen with full descriptions and summarize the best three."
- "Snapshot Wohnmobil listings posted today and table them by price and location."
- "Search Kleinanzeigen for Makita drills from private sellers and flag anything at least 20% under the median."
Beyond the 1,250-result window
Kleinanzeigen shows at most 50 pages (~1,250 results) per search — on a site with hundreds of thousands of ads per category, a naive scraper silently loses everything past that. This scraper automatically splits large queries by category and price band and deduplicates across the shards, so broad crawls are not quietly truncated.
Is it legal to scrape Kleinanzeigen?
Public listing data — prices, descriptions, specs, area-level locations — is public commercial information, and this scraper is built so that the hard part of the question never arises: no personal data enters your dataset in the first place. Germany's data-protection authorities are among Europe's strictest; an output that carries no personal data is the point of this actor, not an afterthought.
Seller-identifying data is never extracted — the scraper reads named fields from named parts of the page and simply never touches the seller profile block, so there is nothing to filter out afterwards. The only seller signal kept is business vs private (Gewerblicher/Privater Nutzer). Requests are rate-limited to keep load on the marketplace negligible, and no anti-bot protections are bypassed.
One honest limit: titles and descriptions are the seller's own words, delivered as-is. If a seller chooses to type contact details into their listing text, that text is not rewritten — the guarantee covers the data fields, not the content sellers publish about themselves.
Troubleshooting
The actor fails fast with the reason in the run's status message:
- "Provide a search query, a category, or both." — the input was empty; fill in
searchQueryand/orcategoryId. - "priceMinEur must not be higher than priceMaxEur." — inverted price range.
- "The site markup may have changed, or the request was blocked." — Kleinanzeigen changed their page structure or rejected the request; the actor refuses to return silently empty data. Check the Issues tab — such changes get fixed quickly.
- Fewer items than requested on a free plan — the 25-item free sample cap; run on a paid Apify plan for full results.
Is there a Kleinanzeigen API alternative?
Kleinanzeigen publishes no public API for listings. This actor is the practical alternative: the same listings as structured JSON through one HTTP call (run-sync-get-dataset-items), on a schedule, or as an MCP tool for AI agents — with the GDPR question already answered in the data itself.
Does Kleinanzeigen block scrapers?
The site serves its listings as regular server-rendered pages, and this actor stays inside that welcome: paced requests, standard datacenter proxies, load kept negligible. No CAPTCHA fights, no bot-wall cat-and-mouse — and when the site's markup changes, the actor fails with a readable message instead of silently returning wrong data.
How do I monitor Kleinanzeigen prices?
Set sortBy: "date" with your query, cap maxItems to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs — every new listing lands in your inbox with the price already parsed (VB and "Zu verschenken" normalized). The AI-assistant prompt above walks a non-technical user through exactly this setup.
FAQ
Can I get seller names or phone numbers? No — by design. That is the product: data you can store, share and process without a GDPR review. The output tells you only whether the seller is a business or a private person.
Do I get full listing descriptions? Yes — enable scrapeDetails and each listing carries its full description plus the spec table, translated to stable English keys. Off by default to keep runs fast and cheap.
What do VB and "Zu verschenken" become? Normalized machine-readable price types: NEGOTIABLE and GIVEAWAY — so your price analysis never chokes on German price idioms.
Can I filter wanted ads (Gesuche) out? Every item carries adType (offer/wanted), so price analysis can exclude wanted ads with one filter.
How fresh is the data? Live at run time — every run queries the site directly. For continuous freshness, schedule the actor.
Can I export to Excel or CSV? Yes — every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.
What happens above 1,250 results? The site caps any single search at ~1,250 results; the actor automatically splits large queries and deduplicates, and flags honestly when a shard is still larger than the window.
Does it work with Make, Zapier or n8n? Yes — it is a standard Apify actor; all platform integrations, webhooks and schedules apply.
Related scrapers
Working the German/Benelux second-hand market? The same GDPR-clean guarantee, same output shape:
- Marktplaats.nl Scraper — the Netherlands' largest marketplace.
- 2dehands & 2ememain Scraper — Belgium's largest second-hand marketplaces.
Support
Found an issue or missing a field you need? Open an issue on the actor's Issues tab — reports get fixed, this actor is actively maintained.