Kleinanzeigen API & Scraper
The Kleinanzeigen API returns listings from Germany's largest classifieds marketplace as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary search endpoint returns listings with ad id, title, preview text, price (with the German VB and Zu verschenken forms already parsed), location, images and pagination — seller type and posting date are NOT on the search row and come from the listing endpoint instead (measured 2026-08-27). Alongside search you can pull a listing, similar ads, categories, filters, location suggestions, a user's listings and a seller. It is built for price intelligence, resale tools and market analytics that need German classifieds data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Reading a Kleinanzeigen price: VB, Zu verschenken and the rest
German classifieds prices are text on the page, not numbers, and the suffix changes what the number means. The API returns the original string next to a parsed number and a flag, so you never have to regex it yourself. Measured on a live search for "fahrrad", 2026-08-26.
| What the ad shows | price_raw | price | negotiable | is_free |
|---|---|---|---|---|
| Fixed asking price | 3.499 € | 3499 | false | false |
| Verhandlungsbasis (open to offers) | 700 € VB | 700 | true | false |
| Verhandlungsbasis, four figures | 1.640 € VB | 1640 | true | false |
| Giveaway (Zu verschenken) | Zu verschenken | null | false | true |
| Giveaway with no price line at all | null | null | false | true |
Watch the giveaways: price is null, not 0, so a sum or average over price has to skip them — branch on is_free instead. VB is short for Verhandlungsbasis, meaning the seller is inviting offers, so treat that number as an upper bound rather than a sale price. currency is always EUR. Also on every row: adid (the numeric ad id, 3483721813), title, description_preview, url, location as postcode plus city (17493 Greifswald), image_url, images, image_count and tags.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/kleinanzeigen/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "iphone"
}
}{
"ok": true,
"meta": {
"api": "kleinanzeigen",
"endpoint": "search",
"mode": "live",
"latency_ms": 4704.8,
"record_count": 27,
"bytes": 335200,
"cache_hit": false,
"locale": "de-DE",
"url": "https://www.kleinanzeigen.de/s-iphone/k0",
"source": "html_srp",
"page": 1,
"has_more": true,
"next_page": 2
},
"data": {
"listings": [
{
"adid": "[redacted-phone]",
"title": "Wir kaufen iPhone 17 / 17 pro / 17 Pro Max neu und Gebraucht✅✅",
"description_preview": "✨ **Wir kaufen Ihr iPhone 17 / 17 Pro / 17 Pro Max / 17 Air – Neu &...",
"url": "https://www.kleinanzeigen.de/s-anzeige/wir-kaufen-iphone-17-17-pro-17-pro-max-neu-und-gebraucht-/[redacted-phone]",
"location": "90402 Mitte",
"image_url": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/2e/2e15de74-72a9-4fa9-9cd4-658bc71aa308?rule=$_2.AUTO",
"images": [
"https://img.kleinanzeigen.de/api/v1/prod-ads/images/2e/2e15de74-72a9-4fa9-9cd4-658bc71aa308?rule=$_2.AUTO"
],
"image_count": 1,
"tags": [
"Gesuch"
],
"price_raw": "999 € VB",
"price": 999,
"negotiable": true,
"is_free": false,
"currency": "EUR"
},
{
"adid": "[redacted-phone]",
"title": "ANKAUF DEFEKT/BESCHÄDIGTE IPHONE 14 15 16 PRO MAX - SOFORTZAHLUNG",
"description_preview": "Wir kaufen speziell beschädigte aber auch unbeschädigte iPhone Modelle an und zahlen das Geld per...",
"url": "https://www.kleinanzeigen.de/s-anzeige/ankauf-defekt-beschaedigte-iphone-14-15-16-pro-max-sofortzahlung/[redacted-phone]",
"location": "42555 Velbert",
"image_url": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/54/545d9c12-272f-4eef-94b4-b335f7cb2ba4?rule=$_2.AUTO",
"images": [
"https://img.kleinanzeigen.de/api/v1/prod-ads/images/54/545d9c12-272f-4eef-94b4-b335f7cb2ba4?rule=$_2.AUTO"
],
"image_count": 1,
"tags": [
"Gesuch",
"Versand möglich"
],
"price_raw": "1 € VB",
"price": 1,
"negotiable": true,
"is_free": false,
"currency": "EUR"
},
{
"adid": "[redacted-phone]",
"title": "iPhone 17 Hülle/Cover Transparent",
"description_preview": "Zu verkaufen iPhone 17 Hülle/Cover Transparent. Die Hülle ist Neu und verpackt. Es befinden...",
"url": "https://www.kleinanzeigen.de/s-anzeige/iphone-17-huelle-cover-transparent/[redacted-phone]",
"location": "53757 Sankt Augustin",
"image_url": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/a7/a7ec588d-d888-452a-80bb-fe093616fb4a?rule=$_2.AUTO",
"images": [
"https://img.kleinanzeigen.de/api/v1/prod-ads/images/a7/a7ec588d-d888-452a-80bb-fe093616fb4a?rule=$_2.AUTO"
],
"image_count": 3,
"tags": [
"Versand möglich"
],
"price_raw": "10 €",
"price": 10,
"negotiable": false,
"is_free": false,
"currency": "EUR"
}
],
"page": 1,
"has_more": true,
"next_page": 2
}
}What the Kleinanzeigen API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Kleinanzeigen classifieds by keyword and/or category with price, location + radius, seller-type and sort filters. Returns normalized listings (title, price, photos, location, seller type) with the true total. Page pagination. | Price-intelligence teams call search to search Kleinanzeigen classifieds by keyword and/or category with price, location + radius, se…. | query, category_id, category_slug, location_id, radius, ... |
| listing | Full listing detail by url, slug or adid: title, price, description, all photos, attributes (e.g. car specs), category breadcrumb, seller id & badges, posted date. | Classifieds aggregators call listing to get full listing detail by url, slug or adid. | url, slug, adid |
| similar | Related/similar listings shown on an ad's detail page ("Das könnte dich auch interessieren") — by url, slug or adid. | Resale and arbitrage tools call similar to get related/similar listings shown on an ad's detail page ("Das könnte dich auch interessieren"). | url, slug, adid |
| categories | Full Kleinanzeigen category tree (id, name, nested children) for discovering category_id values to use in search. | Lead-generation teams call categories to get full Kleinanzeigen category tree (id, name, nested children) for discovering category_id valu…. | none |
| filters | Live filter facets for a query/category from the search filter tree: category, location (state) and attribute facets, each with a result count — so you know which filter values are available and how many listings match. | Price-intelligence teams call filters to get live filter facets for a query/category from the search filter tree. | query, category_id |
| location_suggestions | Autocomplete location names + ids for a partial query — use the returned location_id with search's location_id + radius. | Classifieds aggregators call location_suggestions to get autocomplete location names + ids for a partial query. | query |
| user_listings | All active listings for a seller (by user/seller id), with page pagination. | Resale and arbitrage tools call user_listings to get all active listings for a seller (by user/seller id), with page pagination.. | user_id, page |
| seller | Public seller profile by user/seller id: display name (redacted by default), member since, reputation badges, rating count, and listing count. | Lead-generation teams call seller to get public seller profile by user/seller id. | user_id |
Call search from your stack
curl -X POST https://api.reefapi.com/kleinanzeigen/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"iphone"}'import requests
r = requests.post(
"https://api.reefapi.com/kleinanzeigen/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "iphone"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/kleinanzeigen/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "iphone"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.kleinanzeigen.search with {"query":"iphone"}.Who uses this API and why
- Price-intelligence teams call search to track second-hand prices across Kleinanzeigen categories.
- Resale and arbitrage tools use user_listings to monitor a specific seller's inventory.
- Market analysts use categories and filters to size supply for a product in the German market.
Questions developers ask before integrating
What does VB mean in a Kleinanzeigen price like 700 € VB?
VB stands for Verhandlungsbasis — a negotiating basis. The seller will take offers, so the number is a starting point rather than a firm price. The API parses it for you: price_raw keeps the original "700 € VB", price is 700, negotiable is true and currency is EUR. Ads marked Zu verschenken come back with is_free true and price null (measured 2026-08-26) — null rather than zero, so branch on is_free before you sum or average. If you are tracking prices, decide up front whether negotiable listings belong in the sample too.
What is an adid and where do I find it?
adid is the numeric ad id, the digits at the end of a kleinanzeigen.de/s-anzeige/ URL — for example 3483721813. Every search result carries it, and you pass it to listing for the full ad, to similar for comparable ads, or use the seller behind it to pull their other listings.
How do I search Kleinanzeigen within a radius of a city?
Two steps. Call location_suggestions with a city name or postcode to get a location_id, then send that location_id plus radius in kilometres (10, 20, 50) to search. The plain location string is only for the sorted HTML search and does not do radius — mixing the two up is why radius searches silently come back nationwide.
Can I filter private sellers from commercial dealers?
The parameter exists — privat for private individuals, gewerblich for commercial dealers — but do not trust it today. Measured 2026-08-27, twice: the same query returned 27 rows unfiltered, 2 rows with privat, and ZERO rows with gewerblich, with ok:true and no warning. Treat a filtered count as a floor, not a split, until that is fixed.
How do I page through Kleinanzeigen results?
Search is page-based. Send page (1-based) and follow meta.next_page while meta.has_more is true; a live search for "fahrrad" on 2026-08-26 returned 27 listings on page 1 with more behind it. A search needs a query or a category (category_id or category_slug) — sending neither is rejected rather than returning an empty page.
What is the Kleinanzeigen API?
Kleinanzeigen API is a ReefAPI endpoint group for kleinanzeigen It returns live JSON through POST requests under /kleinanzeigen/v1.
Is the Kleinanzeigen API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Kleinanzeigen calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Kleinanzeigen login or account?
No login to Kleinanzeigen is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Kleinanzeigen data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Kleinanzeigen API use?
Kleinanzeigen actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Kleinanzeigen from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call kleinanzeigen actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Kleinanzeigen API a Kleinanzeigen scraper?
It is the managed alternative to a DIY Kleinanzeigen scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same kleinanzeigen back as clean JSON.
Why does my Kleinanzeigen scraper keep getting blocked?
Most Kleinanzeigen scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked or failed calls are free.