Kleinanzeigen API

Read Kleinanzeigen listings as clean, parsed JSON

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

K
/kleinanzeigen/v1

8 active endpoints. Every call is 1 credit.

  • POST/kleinanzeigen/v1/search
  • POST/kleinanzeigen/v1/listing
  • POST/kleinanzeigen/v1/similar
  • POST/kleinanzeigen/v1/categories
  • POST/kleinanzeigen/v1/filters
  • POST/kleinanzeigen/v1/location_suggestions
  • POST/kleinanzeigen/v1/user_listings
  • +1 more

What Kleinanzeigen endpoints does ReefAPI ship?

8 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

8 endpoints

search

1 cr

Search Kleinanzeigen classifieds by keyword and/or category with price, location + radius, se…

required
optional
query, category_id, category_slug, location_id, radius, location, price_min, price_max, seller_type, sort, page

listing

1 cr

Full listing detail by url, slug or adid.

required
optional
url, slug, adid

similar

1 cr

Related/similar listings shown on an ad's detail page ("Das könnte dich auch interessieren").

required
optional
url, slug, adid

categories

1 cr

Full Kleinanzeigen category tree (id, name, nested children) for discovering category_id valu…

required
optional

filters

1 cr

Live filter facets for a query/category from the search filter tree.

required
optional
query, category_id

location_suggestions

1 cr

Autocomplete location names + ids for a partial query.

required
query
optional

user_listings

1 cr

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

required
user_id
optional
page

seller

1 cr

Public seller profile by user/seller id.

required
user_id
optional

Every parameter, every allowed value →

Kleinanzeigen API

3 of 8 endpoints, ready to run

View docs ↗

The listing feed: title, preview text, photos, location, the ad id and a price already parsed out of the German price string.

1 credit0 required · 4 optional
POST/kleinanzeigen/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Kleinanzeigen API works

Kleinanzeigen is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /kleinanzeigen/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Pin a location, then search inside it

Kleinanzeigen results are shallow — eight pages per query and no total — so the way to get volume is not to page harder, it is to narrow first and run more queries.

01location_suggestions
POST/kleinanzeigen/v1/location_suggestions
{"query": "Berlin"}

Take location_id. It is a string, and its size tells you nothing about whether it is a city or a district.

02search
POST/kleinanzeigen/v1/search
{"query": "fahrrad", "location_id": "3331"}

Narrow searches beat deep paging here. Adding a category or a price band multiplies what you can actually reach.

Two credits. Every endpoint on this engine is one credit, so budgeting is just counting calls.

request
curl -X POST https://api.reefapi.com/kleinanzeigen/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"iphone"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "kleinanzeigen",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

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.

One market, and what the ad id and URL tell you

The country question has a short answer on this engine, so the page spends its space on the one that actually costs people time: reading an ad id and a Kleinanzeigen URL correctly.

Market

Germany only — kleinanzeigen.de, German locale. There is no country parameter, and no second site behind it. If you need a neighbouring country, that is a different engine on the same key.

Currency

Euro, and the German number format is already parsed for you: a price written with a full stop as the thousands mark comes back as an integer.

Ad ids are strings

Ten digits, but delivered as a string, so they arrive quoted in JSON. Storing them as an integer works right up until one has a leading zero.

What a listing URL gives you

The tail of a Kleinanzeigen URL is three numbers: the ad id, the category id, and a location code. The middle one is a real category id — it matches the categories tree exactly, so you can read a category off a URL without spending a call.

Against us — the third number is not a location id

It is close to one and it is not one. Measured on two ads, the number in the URL sat one and five away from the location id the lookup returns for the same place. Use it and you will quietly search a neighbouring town.

Against us — three ways a price can be missing

VB means the price is negotiable and Zu verschenken means it is free — both are handled. But a row whose price is written as VB alone carries no number at all: price null, currency null, negotiable true. Free ads do the same. Roughly one row in five in a measured page had no number in it.

Against us — depth, totals and a broken endpoint

Paging stops after the eighth page and the ninth returns empty without an error, so a query reaches about two hundred ads. The search response carries no result total at all, so market size cannot be read from this engine. And the filters endpoint has been failing on every attempt we have made — it is listed in the catalog and it will not answer.

What people build with Kleinanzeigen

The jobs this data is most often used for.

8

endpoints

1

credit per call

01

Price-intelligence teams call search to track second-hand prices across Kleinanzeigen categories.

02

Resale and arbitrage tools use user_listings to monitor a specific seller's inventory.

03

Market analysts use categories and filters to size supply for a product in the German market.

What Kleinanzeigen data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/kleinanzeigen/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"iphone"}'
python
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"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Kleinanzeigen.

Get a free key →
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.

4 Classifieds & Second-hand APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Kleinanzeigen, you are one call away from the rest of the category — no second contract, no second integration.

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.