Kleinanzeigen Scraper - Listings, Prices & Sellers
Pricing
from $0.79 / 1,000 listing searches
Kleinanzeigen Scraper - Listings, Prices & Sellers
Scrape Kleinanzeigen.de listings by keyword, location or URL: price with VB handling, condition, category, seller, photos and full descriptions. Detail pages on demand.
Pricing
from $0.79 / 1,000 listing searches
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Kleinanzeigen Scraper — Listings, Prices & Sellers 🇩🇪
🎉 Every ad, every price — from $0.90 per 1,000 listings, with VB and giveaway prices parsed properly
Kleinanzeigen.de, Germany's biggest classifieds site (the former eBay Kleinanzeigen): cars, bikes, furniture, phones, tickets and everything else
🔎 What is the Kleinanzeigen Scraper — and when should you use it?
The Kleinanzeigen Scraper turns public classified ads from Kleinanzeigen.de, Germany's biggest classifieds site (formerly eBay Kleinanzeigen) into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: ads from a keyword, a city or postcode, or a search URL you paste. Each row carries the title, the asking price and how that price works — fixed, negotiable (VB) or a giveaway (Zu verschenken) — the condition the seller claims, whether they ship or expect collection, the location, the posted date, the seller and the photo. Ask for the ad page too and each row also gets the untruncated description, the whole photo gallery, the condition and every attribute the seller filled in, the category name and the seller's profile.
Use something else when: the ad is not on kleinanzeigen.de. Use eBay Data Scraper for auction and retail listings on ebay.de with shipping and sold prices, where Kleinanzeigen is largely local and cash-in-hand. Use Marktplaats Scraper for the same classifieds pattern for the Netherlands and Belgium. Use Willhaben Property Scraper for the Austrian classifieds market for property.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/kleinanzeigen-scraper
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want listings and prices from Kleinanzeigen using the Apify Actor `sian.agency/kleinanzeigen-scraper`.Use it when I need: ads from a keyword, a city or postcode, or a search URL you paste. Each row carries the title, the asking price and how that price works — fixed, negotiable (VB) or a giveaway (Zu verschenken) — the condition the seller claims, whether they ship or expect collection, the location, the posted date, the seller and the photo. Ask for the ad page too and each row also gets the untruncated description, the whole photo gallery, the condition and every attribute the seller filled in, the category name and the seller's profile.Don't use it when: the ad is not on kleinanzeigen.de — use ebay-data-scraper or marktplaats-scraper or willhaben-property-scraper instead.How to call it: give `keyword` a keyword and `location` a city or postcode, optionally with `radiusKm`. Narrow with `minPrice`, `maxPrice` or `shippingOnly`. `includeDetails` opens each ad's own page for the full text, the whole gallery, condition, category name and the seller's profile, at an extra charge per ad. To pull a seller's live ads, set `operation` to `seller` and pass `sellerIds` (their list URL or the numeric seller ID); to expand ads you already have, set `operation` to `detail` and pass `adUrls` (full addresses or bare ad IDs); to reuse a search you built on the site, paste it into `searchUrls`.Start with this input:{"operation": "search","keyword": "fahrrad","location": "Berlin","maxPrice": 500,"maxResults": 100}Ask me what they are looking for and where in Germany — a city, a postcode or the whole country — plus whether they want a price ceiling, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Find every bicycle under 500 euros in Berlin that can be posted to me, newest first.
- Pull this seller's live ads on Kleinanzeigen and show me asking prices with condition.
- Track second-hand iPhone prices across Germany daily and tell me which giveaways appeared since yesterday.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/kleinanzeigen-scraper.md.
📋 Overview
Kleinanzeigen is where Germany buys and sells second-hand. A bicycle search in Berlin alone reads around 35,000 live ads, and the site covers every category from cars to concert tickets. This actor turns any slice of that into rows you can sort, filter and drop into a spreadsheet.
What you get:
- ⚡ From $0.90 per 1,000 listings: under almost every comparable tool on the Store. There is no key to buy and no proxy bill behind it.
- 🎯 30+ fields per ad: asking price with VB and giveaway handling, condition, category, location, posted date, seller and photos.
- 💶 German price semantics, parsed:
330 € VBbecomes a negotiable 330,Zu verschenkenbecomes a free ad with price 0 — so your averages and filters behave instead of breaking on German text. - 📍 Anywhere in Germany: a city name, a postcode, a radius around either, or the whole country.
- 🔗 Paste a URL and it just works: copy any search or category address from the site and every filter baked into it travels with it.
- 🏪 A seller's live ads in one run: hand it a seller URL or ID and get their current stock.
- ✨ Ad-page enrichment on demand: the untruncated description, the whole gallery, condition, the category name, the exact posting date and the seller's profile.
✨ Features
- 🔍 Keyword search: any word or phrase, in German or not. German finds more.
- 🌐 Pasted search URLs: reuse a search you built on the site, sub-categories and facets included.
- 📍 Location and radius: a city, a postcode, and how far around it to look.
- 💶 Price bands: min and max in whole euros, applied by the site before it counts results.
- 🚚 Shipping filter: only ads that can be posted to you, which turns a local search into a national one.
- 🏪 Seller listings: every ad on a seller's public list page, from their URL or numeric ID.
- 📄 Ad detail by URL or bare ID: the number in the address is enough, no slug needed.
- 🆕 Newest-first results: the shape a monitoring schedule wants.
- 🧾 Full row transparency: failed inputs come back as rows explaining what to check, and are never charged.
🎬 Quick Start
Pick a keyword and a city, set how many ads you want, press Start. There is no account to connect and no key to paste. Results land in a dataset you can export as JSON, CSV or Excel.
curl -X POST "https://api.apify.com/v2/acts/sian.agency~kleinanzeigen-scraper/runs?token=YOUR_TOKEN" \-H 'Content-Type: application/json' \-d '{"operation":"search","keyword":"fahrrad","location":"Berlin","maxResults":50}'
🚀 Getting Started (3 Simple Steps)
Step 1: Choose what to search
Type a keyword, or paste a search address from the site. Either works on its own.
Step 2: Say where and how narrow
A city or postcode, a radius, a price band, shipping only, or nothing at all (which means all of Germany).
Step 3: Press Start
Results appear as they arrive. Export as JSON, CSV or Excel, or read them straight off the API.
That's it. Within about a minute you'll have:
- Every matching ad with its asking price, and whether that price is fixed, negotiable or a giveaway
- The location and posted date for each one
- The seller behind every ad, ready to expand into their live stock
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | No | search, seller or detail. Defaults to search. |
keyword | string | No | What to search for. German words find more. |
location | string | No | City name or German postcode. Empty means all of Germany. |
searchUrls | array | No | Search or category addresses copied from the site. |
radiusKm | integer | No | How far around the location to look, 0-200. 0 uses the location's own area. |
minPrice / maxPrice | integer | No | Price band in whole euros. 0 means no bound. |
shippingOnly | boolean | No | Only ads that can be posted to you. |
adUrls | array | No | Ad addresses or bare ad IDs, for the detail operation. |
sellerIds | array | No | Seller list URLs or numeric seller IDs, for the seller operation. |
maxResults | integer | No | Whole-run ad budget. Defaults to 100. |
includeDetails | boolean | No | Open each ad's page for the extra fields. Bills one extra event per ad. |
Example: a keyword search with filters
{"operation": "search","keyword": "fahrrad","location": "Berlin","maxPrice": 500,"shippingOnly": true,"maxResults": 100}
Example: a seller's live ads
{"operation": "seller","sellerIds": ["79594745"]}
Example: expand ads you already have
{"operation": "detail","adUrls": ["3499520216"]}
📤 Output
Every row is flat, and all three operations return the same shape, so results merge cleanly. 28 fields, including:
| Field | Type | Description |
|---|---|---|
adId | string | The site's own ad ID. Stable; this is what you dedupe on. |
listingTitle | string | The ad headline as the seller wrote it. |
url | string | The ad's address on the site. |
price | number | Asking price in euros. 0 for giveaways, empty when the seller named none. |
priceText / priceType | string | The price exactly as shown, and FIXED, NEGOTIABLE, FREE or NONE. |
isNegotiable | boolean | Whether the ad is marked VB (verhandlungsbasis). |
condition | string | What the seller selected, in German: Neu, Sehr Gut, Gebraucht… Needs enrichment. |
categoryName / categoryId | string / number | The category, by name and by the site's own ID. Name needs enrichment. |
location | string | Postcode and district, as the site shows it. |
postedLabel | string | When it went up: Heute, 08:05 or 31.08.2026. |
shippingAvailable / shippingLabel | boolean / string | Whether they ship, or expect collection. |
sellerName / sellerUserId | string | Who is selling. Feed the ID back in for their live stock. |
sellerProfileUrl / sellerType | string | Their public list page, and private or commercial. |
imageUrl / imageUrls / imageCount | string / array / number | The first photo, every photo, and how many. Gallery needs enrichment. |
attributes | object | The category's own fields: Art, Typ, Zustand, Farbe and more. |
isTopAd | boolean | Whether the placement is promoted. |
Example row (with enrichment on):
{"adId": "3499520216","listingTitle": "Pegasus Damenfahrrad 28 Zoll 50cm Rahmenhöhe","url": "https://www.kleinanzeigen.de/s-anzeige/pegasus-damenfahrrad-28-zoll-50cm-rahmenhoehe/3499520216-217-9632","price": 330,"priceText": "330 € VB","priceType": "NEGOTIABLE","isNegotiable": true,"condition": "Sehr Gut","categoryName": "Fahrräder & Zubehör","categoryId": 217,"location": "10969 Friedrichshain-Kreuzberg - Kreuzberg","postedLabel": "31.08.2026","shippingAvailable": false,"shippingLabel": "Nur Abholung","sellerName": "H.A.N","sellerUserId": "129290056","sellerProfileUrl": "https://www.kleinanzeigen.de/s-bestandsliste.html?userId=129290056","sellerType": "private","imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/93/93f627a1-2671-4177-bca0-6ab22a747b52?rule=$_59.AUTO","imageCount": 5,"attributes": { "Art": "Damen", "Typ": "Cross- & Trekkingräder", "Zustand": "Sehr Gut" },"status": "success"}
💼 Use Cases & Examples
1. Resale sourcing and price arbitrage
Resellers who need the bottom of a price distribution, not a sample of it.
Input: a keyword, maxPrice, shippingOnly: true.
Output: the cheapest live stock in that niche with photos and the seller behind each one.
Use: buy under market and relist. Giveaways (Zu verschenken) are free stock for flippers who move fast; they parse to price 0, so they are easy to filter for.
2. Second-hand price research
Analysts who need a defensible number for what a used thing is worth.
Input: a keyword, a wide price band, includeDetails: true.
Output: thousands of asking prices with the condition claimed, the exact posting date and the seller's profile.
Use: separate a fair price from an optimistic one, at a sample size a manual check could never reach.
3. Flohmarkt and dealer inventory tracking
Dealers and market analysts watching what the trade is actually asking.
Input: a dealer's seller ID, or a category across a city. Output: their live ads with asking prices and condition, or a whole local market in one sweep. Use: price your own stock against today's market instead of last quarter's guide.
4. New-listing monitoring and alerts
Buyers hunting something scarce, and traders who want first look.
Input: a narrow search on a daily schedule. Output: results come back newest-first, so each run's top rows are what appeared since the last one. Use: a daily watch on a niche category that costs cents, because you never re-pay for yesterday's ads.
5. Seller and trade lead generation
Agencies selling to small businesses that advertise here openly.
Input: a trade-heavy category with includeDetails: true.
Output: commercial sellers flagged by sellerType, with their name, public list page and numeric seller ID.
Use: build a prospect list of bike shops, furniture dealers or tradespeople with proof they are trading.
🔗 Integration Examples
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/kleinanzeigen-scraper').call({operation: 'search',keyword: 'fahrrad',location: 'Hamburg',maxPrice: 500,shippingOnly: true,maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/kleinanzeigen-scraper').call(run_input={'operation': 'search','keyword': 'fahrrad','location': 'Hamburg','maxPrice': 500,'shippingOnly': True,'maxResults': 100,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['listingTitle'], item['price'], item['priceType'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~kleinanzeigen-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"operation":"search","keyword":"fahrrad","location":"Hamburg","maxPrice":500}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: a daily schedule.
- HTTP Request: run this actor with your saved search.
- Process: compare the returned
adIdlist against yesterday's. - Action: post the new ads to Slack, or append them to a sheet.
📊 Performance & Pricing
FREE tier (try it now)
- 25 listings per run, with every feature and every field switched on
- No credit card, no key, no account on the site
- Enough to see the exact shape of the data before you commit
PAID tier (production)
- Unlimited listings per run: searches page 27 ads at a time and keep going as long as results do
- Charged per listing returned. Failed inputs come back as rows explaining why, and are never charged.
💰 From $0.90 per 1,000 listings, falling with your plan tier. Ad-page enrichment is $2.50 per 1,000 when you switch it on, and nothing when you don't. A seller's live ads bill at the search rate.
❓ Frequently Asked Questions
Q: Do I need an API key, a login or a proxy? A: No. Type a keyword and press Start.
Q: How is a negotiable price handled?
A: German classifieds mark prices three ways: fixed (330 €), negotiable (330 € VB) and free (Zu verschenken). Every row carries the exact text, a numeric price — 0 for giveaways — a price type of fixed, negotiable or free, and a negotiable flag. Your averages and price filters work on the number; the flavour survives in the text.
Q: Can I paste a URL instead of filling in filters? A: Yes, that is the Search URLs field. The site resolves the address itself, so sub-categories, price bands and any other facet it carries all apply.
Q: What does "Open each ad's page" add, and what does it cost? A: The untruncated description, every photo instead of the first, the condition and all seller-filled attributes, the category name, the exact posting date and the seller's profile with their type. It costs one extra request per ad, billed as one Listing Detail event on top of the listing row.
Q: Does it return seller phone numbers or email addresses? A: No. The site hides phone numbers behind a login and routes messages through its own inbox, so there is nothing to read. You do get the seller's public list page, name, type and numeric ID.
Q: Why is the price empty on some rows? A: The seller did not set one, typically on job ads and services. The price type field says which case it is, and a price band filter excludes them by design.
Q: Can I get sold prices or price history? A: Not from the site. Ads disappear when they sell and there is no public archive. Run this on a schedule and diff your own snapshots, which is how everyone builds that dataset.
Q: Which site does this cover? A: Kleinanzeigen.de — formerly eBay Kleinanzeigen. One site, all of Germany, every category.
🐛 Troubleshooting
A search returns "no ads matched"
- Widen it: drop the price band, clear the shipping filter, or use a bigger radius.
- German words find far more than English ones:
fahrrad, notbicycle.
A pasted URL comes back with "not a search address"
- That address is an ad, a seller page or the homepage. Open the results page on the site and copy the address from there.
- Ad addresses belong in Ad URLs with the operation set to Listing Detail; the bare ad ID works too.
A seller comes back with "no live ads"
- The seller resolved, but their public list page currently shows nothing. Sellers go quiet between batches.
- Shop pages (the branded
/pro/…addresses) list their ads in the browser only. Search the shop name as a keyword instead.
A price filter dropped ads you expected to see
- Setting either bound excludes ads with no fixed price (giveaways, price-on-request) because the site filters on the price field itself.
- Clear the bounds and filter on
pricein your own export instead.
The condition or category-name column is empty on search rows
- Those live on the ad's own page. Switch on "Open each ad's page" and they arrive on every row.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Kleinanzeigen and eBay Kleinanzeigen are trademarks of their respective owners. This actor is not affiliated with, endorsed by, or sponsored by any of them.
🤝 Support
Join our active support community
- For issues or questions, open an issue on the actor's Issues tab
- Check the SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools