Kleinanzeigen Scraper - Listings, Prices & Sellers avatar

Kleinanzeigen Scraper - Listings, Prices & Sellers

Pricing

from $0.79 / 1,000 listing searches

Go to Apify Store
Kleinanzeigen Scraper - Listings, Prices & Sellers

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Ü

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Kleinanzeigen Scraper — Listings, Prices & Sellers 🇩🇪

Store-SIÁN Agency Store-eBay Data Scraper Store-Marktplaats Scraper Store-Willhaben Property Scraper

🎉 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 € VB becomes a negotiable 330, Zu verschenken becomes 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)

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

FieldTypeRequiredDescription
operationstringNosearch, seller or detail. Defaults to search.
keywordstringNoWhat to search for. German words find more.
locationstringNoCity name or German postcode. Empty means all of Germany.
searchUrlsarrayNoSearch or category addresses copied from the site.
radiusKmintegerNoHow far around the location to look, 0-200. 0 uses the location's own area.
minPrice / maxPriceintegerNoPrice band in whole euros. 0 means no bound.
shippingOnlybooleanNoOnly ads that can be posted to you.
adUrlsarrayNoAd addresses or bare ad IDs, for the detail operation.
sellerIdsarrayNoSeller list URLs or numeric seller IDs, for the seller operation.
maxResultsintegerNoWhole-run ad budget. Defaults to 100.
includeDetailsbooleanNoOpen 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:

FieldTypeDescription
adIdstringThe site's own ad ID. Stable; this is what you dedupe on.
listingTitlestringThe ad headline as the seller wrote it.
urlstringThe ad's address on the site.
pricenumberAsking price in euros. 0 for giveaways, empty when the seller named none.
priceText / priceTypestringThe price exactly as shown, and FIXED, NEGOTIABLE, FREE or NONE.
isNegotiablebooleanWhether the ad is marked VB (verhandlungsbasis).
conditionstringWhat the seller selected, in German: Neu, Sehr Gut, Gebraucht… Needs enrichment.
categoryName / categoryIdstring / numberThe category, by name and by the site's own ID. Name needs enrichment.
locationstringPostcode and district, as the site shows it.
postedLabelstringWhen it went up: Heute, 08:05 or 31.08.2026.
shippingAvailable / shippingLabelboolean / stringWhether they ship, or expect collection.
sellerName / sellerUserIdstringWho is selling. Feed the ID back in for their live stock.
sellerProfileUrl / sellerTypestringTheir public list page, and private or commercial.
imageUrl / imageUrls / imageCountstring / array / numberThe first photo, every photo, and how many. Gallery needs enrichment.
attributesobjectThe category's own fields: Art, Typ, Zustand, Farbe and more.
isTopAdbooleanWhether 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 ApifyClient
client = 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)

  1. Trigger: a daily schedule.
  2. HTTP Request: run this actor with your saved search.
  3. Process: compare the returned adId list against yesterday's.
  4. 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
  • 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.

🔗 View current pricing


❓ 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, not bicycle.

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 price in 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.

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

Telegram Support

Join our active support community


Built by SIÁN Agency | More Tools