markt.de API: Kleinanzeigen aus ganz Deutschland mit Preis, Ort und Preistyp als JSON
markt.de ist ein allgemeiner Kleinanzeigenmarkt: Fahrzeuge, Tiere, Haus & Garten, Immobilien, Jobs, Dienstleistungen und Bekanntschaften auf einer Seite. Die API gibt die öffentlich sichtbaren Anzeigen als JSON zurück, mit Preis in Euro, dem Preistyp, wie markt.de ihn führt (Festpreis, VB, Zu verschenken, Tausch, Stundensatz), Postleitzahl und Ort, Kategorie und Fotos. Ort und Kategorie prüft die API gegen markt.de selbst. Versteht markt.de einen Ort nicht, etwa den Tippfehler „Leipzigg“, kommt INVALID_PARAM zurück und nicht stillschweigend der ganze Anzeigenbestand. Welche Schreibweisen gelten, liefert `locations`: „leipz“ ergab 14 Treffer, von „Landkreis Leipzig“ bis „Leipzig Süd“. Eigene Anzeigen aufgeben oder Nachrichten an Inserenten verwalten lässt sich damit nicht: Diese API liest nur, was ohne Login auf markt.de steht, und sammelt keine Kontaktdaten von Verkäufern.
Endpunkte
| endpoint | Was zurückkommt | Pflicht |
|---|---|---|
| search | Suche über Stichwort, Kategorie oder beides: 20 Anzeigen je Seite und die Trefferzahl, die markt.de selbst nennt; bei weniger als 20 Treffern genau diese Anzeigen. Filter: Ort mit Umkreis bis 300 km, Preisspanne in Euro, Anzeigentyp (privat, gewerblich, Gesuch), Preistyp und Sortierung (neueste zuerst, Preis auf- oder absteigend). In `filters_applied` steht, welche Filter markt.de tatsächlich übernommen hat. | alle optional |
| detail | Eine Anzeige vollständig über ihre achtstellige id (etwa 4c9d46a2) oder die URL: Titel, Preis samt Gegenprobe gegen den maschinenlesbaren Preis der Seite, ganze Beschreibung, die Attributtabelle des Inserenten, Kategoriepfad, Ort, Einstelldatum und alle Fotos. Eine gelöschte Anzeige ergibt NOT_FOUND. | alle optional |
| categories | Die Kategorien von markt.de, jeweils eine Ebene, mit der aktuellen Zahl der Anzeigen. Mit `query` zeigt der Endpunkt, wie sich die Treffer eines Suchbegriffs auf die Kategorien verteilen; daher stammen die ids für `category`. | alle optional |
| locations | Die Ortsvorschläge von markt.de zu einer Teileingabe: Städte, Stadtteile, Landkreise und Bundesländer in der Schreibweise, die `search` als `location` annimmt. | query |
Jeder Aufruf wird in Credits abgerechnet. Fehlgeschlagene und blockierte Aufrufe sind kostenlos.
Funktionierendes Beispiel
Bei Brennholz sagt der Preis allein wenig. Die Anzeige aus Delbrück nennt 35 € „für 1 srm“ (Schüttraummeter, lose geschüttet), das Eichenholz aus Münnerstadt kostet laut Beschreibung 145 € „pro Ster“, also je Raummeter geschichtet. In `amount_eur` steht in beiden Fällen nur die Zahl, die Einheit steht allein im Freitext. Unter den 108 Treffern in „Haus & Garten“ waren außerdem eine Akku-Kettensäge, ein Gesuch („Suche günstiges Brennholz“, Preistyp VB, ohne Betrag) und eine Anzeige mit „Zu verschenken“. Mit `"ad_type": "private"` blieben 91 Treffer.
curl -X POST https://api.reefapi.com/marktde/v1/search \
-H "x-api-key: IHR_API_SCHLUESSEL" \
-H "content-type: application/json" \
-d '{"query": "Brennholz", "category": "2200000000"}'{
"ok": true,
"data": {
"listings": [
{
"id": "18bb133e",
"url": "https://www.markt.de/brennholz/a/18bb133e/",
"title": "Brennholz",
"description": "Brennholz aus Produktionsresten,Kantholzer,Bohlen,Brettern. Nadelholz mit etwas Buche. Preis für 1 srm 35€. ...",
"price": { "amount_eur": 35.0, "currency": "EUR", "formatted": "35 €", "label": "Festpreis", "negotiable": null },
"location": { "postal_code": "33129", "city": "Delbrück" },
"posted": "Heute, 06:54",
"category": "Brennholz",
"image_count": 1,
"seller": { "member_tier": "Basis", "online": null },
"promoted": false
},
...
{
"id": "d348b3a5",
"title": "Altholzannahne jeglicher Art",
"price": { "amount_eur": null, "currency": null, "formatted": null, "label": "Zu verschenken", "negotiable": null },
"location": { "postal_code": "48496", "city": "Hopsten" },
"posted": "25.10.2026",
"category": "Brennholz",
...
},
{
"id": "597339db",
"title": "Suche günstiges Brennholz",
"price": { "amount_eur": null, "currency": null, "formatted": null, "label": "VB", "negotiable": true },
"location": { "postal_code": "31228", "city": "Peine" },
"posted": "24.10.2026",
...
},
...
],
"total": 108,
"page": 1,
"page_size": 20,
"has_more": true,
"next_page": 2,
"filters_applied": { "category": "2200000000" },
"canonical_url": "https://www.markt.de/haus-garten/suche/Brennholz/"
},
"meta": { "record_count": 20, "completeness_pct": 100.0, "promoted_rows": 0, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}markt.de scrapen: Antworten, die normal aussehen und es nicht sind
Einen Filter, den markt.de nicht versteht, lässt die Seite stillschweigend fallen: Zurück kommt Status 200 und eine gewöhnliche Trefferseite, nur eben ungefiltert. Beim Bau der Engine am 30. September 2026 ergaben ein erfundener Ort, eine erfundene Kategorie-id, ein falscher Anzeigentyp und ein erfundener Parameter jeweils 10.418 Treffer für „fahrrad“, genau so viele wie ganz ohne Filter. Ein Skript, das so nach „Fahrrad in Berlin“ fragt und sich bei Berlin vertippt, wertet den gesamten Bestand aus. Die API liest deshalb, wohin markt.de die Anfrage weiterleitet: Ein verstandener Ort oder eine verstandene Kategorie wandert in den Pfad (/berlin/fahrzeuge/suche/fahrrad/), alles andere bleibt unverändert in der Adresse stehen und führt zur Ablehnung.
Eine Suche ohne Treffer zeigt „0 Treffer“ und darunter trotzdem 20 fremde Anzeigen. Bei 1 bis 19 Treffern ist es dasselbe: Nach dem Hinweis „Leider wurden nur 3 Anzeigen gefunden.“ füllt markt.de die Seite mit fremden Anzeigen auf. Wer Zeilen zählt statt die Trefferzahl zu lesen, speichert falsche Ergebnisse. Die API liest Anzeigen nur oberhalb dieses Hinweises: Bei null Treffern kommt eine leere Liste, bei drei Treffern kommen drei Zeilen. Den Fall null Treffer deckte sie von Anfang an ab, den Fall 1 bis 19 erst seit dem 28. Oktober 2026.
Die Beträge schreibt markt.de deutsch: 60 €, 1.000 €, 49.600 € und mit Cents 1.250,50 €. Wer den Tausenderpunkt als Dezimalpunkt liest, liegt um den Faktor 1000 daneben, und die Spalte ist trotzdem voll. Jeder Betrag wird deshalb gegen den Text geprüft, den markt.de daneben druckt; beim Bau gab es auf 79 Anzeigen mit Preis keine Abweichung.
Auch auf unserer Seite steckte ein Fehler: Im Seitenkopf jeder markt.de-Seite steht ein Skript, dessen Name das Wort „captcha“ enthält. Unsere Sperrerkennung hielt deshalb eine leere Suche, eine Ortssuche und eine gelöschte Anzeige für eine Blockade. Das wurde vor der Abnahme korrigiert; eine gelöschte Anzeige ist jetzt NOT_FOUND.
Bei einer einzelnen Suche fällt davon wenig auf. Wer markt.de jede Woche für denselben Landkreis auswertet, bemerkt solche Fehler erst, wenn die Zahlen nicht mehr plausibel sind.
Weitere Dokumentation auf Deutsch
- idealo API — Dokumentation
- AutoScout24 API — Dokumentation
- mobile.de API — Dokumentation
- Kleinanzeigen API — Dokumentation
- Immowelt API — Dokumentation
- OTTO API — Dokumentation
- willhaben API — Dokumentation
- MediaMarkt API — Dokumentation
- Zalando API — Dokumentation
- Amazon API (amazon.de) — Dokumentation
- Zara API — Preise Deutschland
- Cardmarket API — Dokumentation
- AliExpress API — Dokumentation
- Vinted API — Dokumentation
- Catawiki API — Dokumentation
- eBay API für ebay.de
- Temu API — Preise für Deutschland
- Autodoc API — Ersatzteile und Preise
- ricardo.ch API — Schnittstelle
- IKEA API (ikea.com/de) — Dokumentation
- gebrauchtwagen.at API — Dokumentation
- autolina.ch API — Schnittstelle
Grenzen und ehrliche Hinweise
- markt.de ist an dieser API nicht beteiligt: Sie ist inoffiziell, und mit markt.de besteht keine Vereinbarung.
- Bis zum 28. Oktober 2026 kamen bei Suchen mit 1 bis 19 Treffern trotzdem 20 Zeilen zurück, aufgefüllt mit Anzeigen aus ganz Deutschland, die mit der Suche nichts zu tun hatten. Seit der Korrektur am selben Tag liefert „Emmaljunga“ bundesweit (`total` 3) drei Zeilen, „Brennholz“ mit München und 50 km (`total` 4) vier und „Kinderwagen“ mit Leipzig und 25 km (`total` 10) zehn. Wer Daten aus der Zeit davor gespeichert hat, sollte dort nur die ersten `total` Zeilen einer Seite behalten.
- Das Stichwort durchsucht auch die Beschreibung. Von 998 Treffern für „Kinderwagen“ lagen laut `categories` 710 in Immobilien. In Leipzig mit 25 km waren alle 10 Treffer Wohnungen oder Häuser, und in 9 davon stand das Wort in der Beschreibung, in Sätzen wie „eigene Räume für Fahrräder und Kinderwagen“. Für Waren also immer eine Kategorie mitgeben.
- Bei Mietangeboten steht im Preis die Miete, erkennbar am Preistyp: Eine Wohnung in Leipzig kam mit 1.249 € und dem Label „Nettokaltmiete“. `price.label` gehört deshalb in jede Auswertung.
- Fehlt ein Betrag (verschenken, Tausch, Gesuch, viele Dienstleistungen), ist `amount_eur` null und das Label von markt.de bleibt erhalten. Eine 0 steht nie für einen fehlenden Preis.
- Ob ein Inserent privat oder gewerblich ist, steht nicht in der Trefferzeile, weil markt.de es dort nicht anzeigt; gefiltert wird über `ad_type`. Namen, Telefonnummern, E-Mail-Adressen und Profil-Links von Inserenten erfasst die API nicht.
- `posted` kommt so, wie markt.de es schreibt („Heute, 06:54“, „Heute, vor 3 Min.“, „25.10.2026“), ohne Umrechnung in einen Zeitstempel.
- Eine Sortierung nach Relevanz gibt es nicht, weil markt.de dafür keinen Parameter in der Adresse hat. Blättern lässt sich bis Seite 200, mit 20 Anzeigen je Seite.
- Alle vier Endpunkte werden mit 1 Credit je Aufruf abgerechnet; eine Ablehnung wegen eines unbekannten Filters oder Orts (INVALID_PARAM) kostet nichts.