Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Kleinanzeigen API page →
Classifieds & Second-hand

Kleinanzeigen API & Scraper

The Kleinanzeigen API returns listings from Germany's largest classifieds marketplace as clean JSON.

8 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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 showsprice_rawpricenegotiableis_free
Fixed asking price3.499 €3499falsefalse
Verhandlungsbasis (open to offers)700 € VB700truefalse
Verhandlungsbasis, four figures1.640 € VB1640truefalse
Giveaway (Zu verschenken)Zu verschenkennullfalsetrue
Giveaway with no price line at allnullnullfalsetrue

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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/kleinanzeigen/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "iphone"
  }
}
Captured response
{
  "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
  }
}
Actions

What the Kleinanzeigen API does

ActionDescriptionConcrete use caseKey params
searchSearch 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, ...
listingFull 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
similarRelated/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
categoriesFull 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
filtersLive 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_suggestionsAutocomplete 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_listingsAll 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
sellerPublic 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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.kleinanzeigen.search with {"query":"iphone"}.
Use cases

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.
FAQ

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.

docs / kleinanzeigen

Kleinanzeigen

Kleinanzeigen

base /kleinanzeigen/v18 endpoints
post/kleinanzeigen/v1/listing1 credit

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.

ParameterAllowed / rangeDescription
urloptionalFull Kleinanzeigen listing URL. (listing needs url OR slug OR adid.)
slugoptionalListing slug/path (the s-anzeige/... part).
adidoptionalNumeric ad id (from a search result's adid).
Try in playground →
post/kleinanzeigen/v1/similar1 credit

Related/similar listings shown on an ad's detail page ("Das könnte dich auch interessieren") — by url, slug or adid.

ParameterAllowed / rangeDescription
urloptionalFull listing URL. (similar needs url OR slug OR adid.)
slugoptionalListing slug/path.
adidoptionalNumeric ad id of the source listing — the shortest locator (get one from the search action's adid).
Try in playground →
post/kleinanzeigen/v1/categories1 credit

Full Kleinanzeigen category tree (id, name, nested children) for discovering category_id values to use in search.

Try in playground →
post/kleinanzeigen/v1/filters1 credit

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.

ParameterAllowed / rangeDescription
queryoptionalKeyword to scope facets to (filters needs query OR category_id).
category_idoptionalCategory id to scope facets to.
Try in playground →
post/kleinanzeigen/v1/location_suggestions1 credit

Autocomplete location names + ids for a partial query — use the returned location_id with search's location_id + radius.

ParameterAllowed / rangeDescription
queryrequiredPartial location text to autocomplete (e.g. Munc).
Try in playground →
post/kleinanzeigen/v1/user_listings1 credit

All active listings for a seller (by user/seller id), with page pagination.

ParameterAllowed / rangeDescription
user_idrequiredSeller user/seller id (a listing's seller_id).
page = 1optional1–Result page (1-based). Page forward with meta.next_page.
Try in playground →
post/kleinanzeigen/v1/seller1 credit

Public seller profile by user/seller id: display name (redacted by default), member since, reputation badges, rating count, and listing count.

ParameterAllowed / rangeDescription
user_idrequiredSeller user/seller id.
Try in playground →