RessourcenAPI v2

Entwicklerdokumentation

Aktuelle Kleinanzeigen-Daten per API abrufen: Suche, Inseratdetails, Verkäufer, Kategorien und Standorte.

Markdown direkt einfügen — oder die URL an deine KI schicken.

Schnellstart

Mit der API rufst du aktuelle Kleinanzeigen-Daten direkt in deiner eigenen Anwendung ab: Suche, Inseratdetails, Verkäuferprofile, Verkäufer-Inserate, Kategorien und Standorte. Du arbeitest mit normalen HTTP-Requests und JSON-Antworten.

Was du brauchst

  • Einen aktiven Kleinanzeigen-Agent Account.
  • Einen API-Key aus deinem Dashboard.
  • Ausreichend Credits für die Anfragen, die du ausführen willst.

Basis-URL

https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen

api.kleinanzeigen-agent.de ist die produktive API-Subdomain. Alle Beispiele in der Dokumentation verwenden diese URL.

Erste Suche

curl "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/search?q=iphone&location_id=3331&distance=25" \
  -H "klaz_key: klaz_live_..."

Beispiel in JavaScript

const url = new URL(
  "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/search"
);

url.searchParams.set("q", "iphone");
url.searchParams.set("location_id", "3331");
url.searchParams.set("distance", "25");

const response = await fetch(url, {
  headers: {
    klaz_key: process.env.KLAZ_API_KEY!,
  },
});

const result = await response.json();

Antwort lesen

Jede Antwort hat dieselbe Grundstruktur. Bei einer erfolgreichen Suche findest du die Treffer unter data.ads und Informationen zur Seite unter data.meta.

{
  "success": true,
  "message": "Kleinanzeigen live search completed",
  "data": {
    "meta": {
      "page": 0,
      "size": 31,
      "total": 126,
      "exact_total": true,
      "has_next_page": true,
      "next_page": 1,
      "source": "live"
    },
    "ads": [
      {
        "ad_id": "1234567890",
        "title": "iPhone 15",
        "price": {
          "amount": 650,
          "currency_code": "EUR"
        },
        "ad_url": "https://www.kleinanzeigen.de/..."
      }
    ]
  },
  "request_id": "req_..."
}

request_id ist die ID der Anfrage. Gib sie bei Support-Fragen mit an, damit wir den Request schneller finden können.

Defaults

page startet bei 0. size ist standardmäßig 31 und maximal 100. Alle Parameter und Antwortfelder verwenden snake_case.

Authentifizierung

Dein API-Key identifiziert deinen Account und ordnet die verbrauchten Credits deinem Guthaben zu. Sende ihn bei jeder API-Anfrage im Header klaz_key.

klaz_key: klaz_live_...

Den MCP Server richtest du am besten mit einem Login im Browser ein. Wenn dein MCP-Client das noch nicht unterstützt, kannst du denselben Key als Bearer Token senden:

Authorization: Bearer klaz_live_...

API-Key verwalten

Du findest deinen API-Key im Dashboard. Der vollständige Key wird nur beim Erstellen oder Rotieren angezeigt. Danach siehst du aus Sicherheitsgründen nur noch eine maskierte Version.

Wenn ein Key versehentlich geteilt wurde, rotiere ihn im Dashboard. Der alte Key wird dadurch ungültig und du erhältst einen neuen.

Sicherer Einsatz

Speichere den Key in deiner Serverumgebung, zum Beispiel als Secret oder Environment Variable. Nutze ihn nicht direkt in öffentlichem Browser-Code und committe ihn nicht in dein Repository.

Sende den Key immer als Header. Verwende ihn nicht als Query-Parameter, weil URLs oft in Logs, Monitoring-Systemen oder Browser-Historien landen.

Typische Auth-Fehler

401 bedeutet, dass der Header fehlt oder der Key ungültig ist. Prüfe in diesem Fall den Headernamen klaz_key, den vollständigen Key-Wert und ob der Key im Dashboard rotiert wurde.

429 bedeutet, dass dein aktuelles Rate Limit erreicht wurde. Reduziere die Anfragefrequenz oder wähle einen Plan mit höherem Limit.

API Referenz

Diese Endpunkte sind für deine Anwendung gedacht. Alle Requests sind GET-Requests, benötigen den Header klaz_key und liefern JSON zurück.

Inserate suchen

GET /api/v2/kleinanzeigen/search

Nutze diesen Endpoint für Suchseiten, Preisvergleiche, Monitoring oder Matching in deiner Anwendung.

Parameter:

  • q string: Suchbegriff.
  • page integer, Default 0: Ergebnis-Seite, startet bei 0.
  • size integer, Default 31: Ergebnisse pro Seite, maximal 100.
  • category_id string: Kleinanzeigen-Kategorie.
  • location_id string: Kleinanzeigen-Standort. Nicht zusammen mit latitude und longitude verwenden.
  • distance string: Umkreis in Kilometern.
  • min_price integer: Mindestpreis.
  • max_price integer: Höchstpreis.
  • picture_required boolean: Nur Inserate mit Bildern.
  • buy_now_only boolean: Nur Direktkauf-Inserate.
  • shippable boolean: Nur Inserate mit Versand.
  • ad_type enum: OFFER oder WANTED. OFFER ist die normale Angebotssuche und wird nicht extra an Kleinanzeigen gesendet. Nur WANTED wird als Gesuch-Filter weitergereicht.
  • poster_type enum: PRIVATE oder COMMERCIAL.
  • latitude number: Breitengrad. Nur zusammen mit longitude.
  • longitude number: Längengrad. Nur zusammen mit latitude.
  • attr[...] string: Kategorieattribute, zum Beispiel attr[condition]=new.

sort_type ist aktuell nicht verfügbar. Die API antwortet mit 400, wenn der Parameter gesendet wird.

curl "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/search?q=sofa&min_price=50&max_price=300&picture_required=true" \
  -H "klaz_key: klaz_live_..."

Die Antwort enthält data.meta und data.ads. data.meta enthält page, size, total, exact_total, has_next_page, next_page und source; Paging bleibt damit auf unserer API-Oberfläche und enthält keine Upstream-URLs. Jedes Inserat kommt in einem konsistenten Format zurück. shipping_available ist true, false oder null, wenn Kleinanzeigen in der Antwort kein zuverlässiges Versandsignal liefert; shippable=true filtert trotzdem serverseitig bei Kleinanzeigen.

{
  "ad_id": "1234567890",
  "title": "Sofa",
  "description": "Guter Zustand",
  "price": {
    "amount": 120,
    "currency_code": "EUR",
    "currency_label": "Euro",
    "price_type": "FIXED",
    "negotiable": false
  },
  "shipping_available": true,
  "buy_now_available": false,
  "images": [],
  "ad_url": "https://www.kleinanzeigen.de/...",
  "views": null,
  "created_at": "2026-05-04T10:00:00.000Z",
  "status": "ACTIVE",
  "deleted": false,
  "seller": {
    "seller_id": "abc123",
    "name": "Max",
    "type": "PRIVATE"
  },
  "location": {
    "id": "3331",
    "name": "Berlin",
    "city": "Berlin"
  },
  "category": {
    "id": "88",
    "name": "Sofas",
    "parent_id": "80"
  },
  "attributes": [],
  "details": {}
}

Kleinanzeigen liefert in Suchantworten oft keine user-id. seller.seller_id kann deshalb bei /search null sein; nutze GET /api/v2/kleinanzeigen/ads/:ad_id, wenn du die Verkäufer-ID zuverlässig brauchst.

Genau diese Filter kannst du auch für Webhooks verwenden. Wir fragen die Live-Suche im gebuchten Intervall automatisch für dich ab und schicken dir jedes passende Inserat genau einmal.

Inseratdetails abrufen

GET /api/v2/kleinanzeigen/ads/:ad_id

Parameter:

  • ad_id numeric string, erforderlich: Kleinanzeigen-Inserat-ID im Pfad.
  • include_views boolean, Default false: Lädt zusätzlich die Aufrufzahl und berechnet einen Extra-Credit.
curl "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/ads/1234567890?include_views=true" \
  -H "klaz_key: klaz_live_..."

Antwort:

{
  "success": true,
  "message": "Kleinanzeigen ad fetched",
  "data": {
    "source": "live",
    "ad": {
      "ad_id": "1234567890",
      "title": "Sofa",
      "views": 42
    }
  },
  "request_id": "req_..."
}

Inseratstatus prüfen

GET /api/v2/kleinanzeigen/ads/:ad_id/status

Nutze diesen Endpoint, wenn du nur wissen willst, ob ein Inserat noch aktiv ist. include_views=true ist auch hier möglich.

{
  "success": true,
  "data": {
    "source": "live",
    "status": {
      "ad_id": "1234567890",
      "status": "ACTIVE",
      "deleted": false,
      "views": null
    }
  },
  "request_id": "req_..."
}

Verkäuferprofil abrufen

GET /api/v2/kleinanzeigen/sellers/:seller_id/profile

Parameter:

  • seller_id string, erforderlich: Verkäufer-ID aus ad.seller.seller_id.

Die Antwort nutzt das echte öffentliche Kleinanzeigen-Profil. Sie ist nicht aus den Inseraten zusammengesetzt. Je nach Verkäufer kann Kleinanzeigen einzelne Felder weglassen; deshalb sind viele Felder nullable.

{
  "success": true,
  "data": {
    "source": "live",
    "profile": {
      "seller_id": "12345678",
      "name": "Max",
      "initials": "M",
      "type": "PRIVATE",
      "account_type": "PRIVATE",
      "since": "2021-03-12T10:15:30.000Z",
      "counters": {
        "historical_ads": 120,
        "online_ads": 8,
        "followers": 4,
        "following": 0
      },
      "ratings": {
        "average_rating": 4.8
      },
      "badges": [
        {
          "name": "friendly",
          "level": 1,
          "value": null
        }
      ],
      "biz_branding": null
    }
  },
  "request_id": "req_..."
}

Weitere Inserate eines Verkäufers

GET /api/v2/kleinanzeigen/sellers/:seller_id/ads

Parameter:

  • seller_id string, erforderlich: Verkäufer-ID aus ad.seller.seller_id.
  • page integer, Default 0: Ergebnis-Seite.
  • size integer, Default 31: Ergebnisse pro Seite, maximal 100.

Die Antwort entspricht der Suchantwort mit data.meta und data.ads.

Kategorien

GET /api/v2/kleinanzeigen/categories
GET /api/v2/kleinanzeigen/categories/:category_id/metadata
GET /api/v2/kleinanzeigen/categories/:category_id/search-metadata

Nutze Kategorien, um Suchanfragen genauer einzugrenzen und passende Filter für deine Oberfläche zu bauen.

/categories liefert den Kategoriebaum. metadata liefert verfügbare Felder für eine Kategorie. search-metadata liefert Suchfilter und Attribute, die du für attr[...] verwenden kannst.

curl "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/categories/161/search-metadata" \
  -H "klaz_key: klaz_live_..."

Standorte

GET /api/v2/kleinanzeigen/locations
GET /api/v2/kleinanzeigen/locations/:location_id

Parameter:

  • q string: Standortsuche nach Name oder PLZ.
  • latitude number: Breitengrad. Nur zusammen mit longitude.
  • longitude number: Längengrad. Nur zusammen mit latitude.
  • limit integer, Default 100: Maximale Anzahl normalisierter Standorte, maximal 500.
curl "https://api.kleinanzeigen-agent.de/api/v2/kleinanzeigen/locations?q=Berlin&limit=10" \
  -H "klaz_key: klaz_live_..."

Nutze Standorte für Autocomplete, regionale Suchen und Umkreissuchen. Die Standortliste wird flach zurückgegeben, damit du sie direkt in Suchfeldern oder Matchern verwenden kannst.

MCP Server

Mit dem MCP Server kann ein KI-Client Kleinanzeigen Agent selbst nutzen. Er kann live suchen, Inseratdetails laden, Verkäufer prüfen und die Ergebnisse für dich weiterverarbeiten.

Kurz gesagt: MCP passt, wenn du einer KI eine Rechercheaufgabe gibst. Für feste Abläufe in deiner eigenen Software ist die API weiterhin der richtige Weg.

Wann du MCP verwenden solltest

Nutze MCP, wenn ein KI-Client interaktiv mit Live-Daten arbeiten soll:

  • Recherche-Assistenten, die erst suchen und dann einzelne Treffer prüfen.
  • Agenten, die Verkäufer, Kategorien oder Standorte abhängig vom Zwischenergebnis nachladen.
  • Interne Tools, in denen ein Mensch Fragen stellt und der Client passende Kleinanzeigen-Tools aufruft.
  • Marktanalysen, bei denen ein Modell mehrere Suchen ausführt und daraus eine Tabelle oder Shortlist erstellt.

Nutze stattdessen die API, wenn deine eigene Software feste Anfragen ausführt. Nutze Webhooks, wenn du dauerhaft neue Inserate zu gespeicherten Filtern überwachen willst.

Server-URL

https://api.kleinanzeigen-agent.de/mcp

Diese URL trägst du in deinem MCP-Client ein. Die technischen Nachrichten erzeugt dein Client automatisch; du musst sie normalerweise nicht selbst schreiben.

Authentifizierung

Empfohlen ist der Login im Browser: Dein MCP-Client öffnet einmal Kleinanzeigen Agent, du meldest dich an und erlaubst den Zugriff. Danach merkt sich der Client die Verbindung; dein API-Key muss nicht mehr in die lokale MCP-Konfiguration.

Wenn dein Client diesen Login unterstützt, füge nur die Server-URL hinzu und starte danach den Login im Client:

https://api.kleinanzeigen-agent.de/mcp

Für ältere Clients bleibt die Einrichtung mit API-Key möglich. Verwende dafür:

Authorization: Bearer klaz_live_...

Aus Kompatibilitätsgründen akzeptiert der MCP Server auch den bestehenden API-Header:

klaz_key: klaz_live_...

Speichere den Key nur als Secret in deinem MCP-Client. Gib ihn nicht in einen Prompt ein, hänge ihn nicht an die URL und committe ihn nicht in eine Config-Datei. Wenn ein Key öffentlich geworden ist, rotiere ihn im Dashboard.

Tools

Alle Werkzeuge liefern Ergebnisse im gleichen Format wie die API zurück. Dein Client kann sie anzeigen, zusammenfassen oder für den nächsten Schritt weiterverwenden.

Wenn dein System sehr viele Treffer sammeln, stark filtern oder eigene Zwischenergebnisse bauen soll, kann es statt MCP auch direkt die API nutzen. Die komplette API-Doku gibt es als Markdown unter https://kleinanzeigen-agent.de/api/docs-raw, damit KI-Clients sie direkt lesen können. Für die API brauchst du weiterhin deinen klaz_live_... API-Key als Authorization: Bearer ... Header oder als klaz_key Header. Der Key gehört trotzdem in Secrets oder Umgebungsvariablen, nicht in Prompts, Logs oder Code.

ToolTypische EingabenZweckCredits
search_kleinanzeigenq, category_id, location_id, distance, Preisfilter, Versandfilter, AttributeLive-Inserate suchen1
get_kleinanzeigen_adad_id, optional include_viewsInseratdetails laden1
get_kleinanzeigen_ad_statusad_id, optional include_viewsPrüfen, ob ein Inserat aktiv oder gelöscht ist1
get_kleinanzeigen_seller_profileseller_idÖffentliches Verkäuferprofil mit Name, Badges und Zählern laden1
get_kleinanzeigen_seller_adsseller_id, page, sizeWeitere Inserate eines Verkäufers laden2
list_kleinanzeigen_categorieskeineKategoriebaum laden1
get_kleinanzeigen_category_metadatacategory_idFelder einer Kategorie ansehen1
get_kleinanzeigen_category_search_metadatacategory_idSuchfilter und Attribute einer Kategorie laden1
search_kleinanzeigen_locationsq oder Koordinaten, optional limitStandorte suchen1
get_kleinanzeigen_locationlocation_idStandortdetails laden1

Bei get_kleinanzeigen_ad und get_kleinanzeigen_ad_status kostet include_views=true einen zusätzlichen Credit.

page ist 0-basiert: Die erste Ergebnisseite ist page: 0. Wenn ein MCP Client versehentlich eine Seite außerhalb des vorhandenen Ergebnisbereichs anfragt, lädt das Tool automatisch die letzte verfügbare Seite nach.

sort_type wird von der Live-Suche aktuell nicht unterstützt. Wenn du sortierte Ergebnisse brauchst, lass deinen MCP Client die zurückgegebenen Inserate nach Preis, Datum oder anderem Feld sortieren.

Ungültige Angaben kosten keine Credits. Wenn eine Live-Abfrage bei Kleinanzeigen fehlschlägt, wird der Credit wie bei der API automatisch zurückerstattet. Die Limits hängen weiter an deinem Plan.

Beispiel für ältere Clients mit API-Key

Wenn dein MCP-Client den Login im Browser noch nicht unterstützt, kannst du den Server mit deinem API-Key verbinden:

{
  "mcpServers": {
    "kleinanzeigen-agent": {
      "url": "https://api.kleinanzeigen-agent.de/mcp",
      "headers": {
        "Authorization": "Bearer klaz_live_..."
      }
    }
  }
}

Danach sollte dein Client die Werkzeuge selbst finden. Je nach Client heißt die Funktion zum Hinzufügen eines Servers anders, aber die wichtigen Teile bleiben gleich: Server-URL und, bei älteren Clients, der API-Key.

Codex CLI

Wenn du Codex lokal nutzt, kannst du den MCP Server direkt über die CLI hinzufügen und danach den Login starten:

codex mcp add kleinanzeigen-agent \
  --url https://api.kleinanzeigen-agent.de/mcp

codex mcp login kleinanzeigen-agent

Prüfen kannst du die Verbindung mit:

codex mcp list

In der Codex-Oberfläche zeigt /mcp die verbundenen MCP Server.

Wenn deine Codex-Version diesen Login noch nicht unterstützt, nutze die API-Key-Variante mit --bearer-token-env-var KLAZ_API_KEY.

Claude Code CLI

Wenn du Claude Code nutzt, kannst du den Server ebenfalls per CLI eintragen und danach den Login starten:

claude mcp add --transport http kleinanzeigen-agent \
  https://api.kleinanzeigen-agent.de/mcp

claude mcp login kleinanzeigen-agent

Prüfen kannst du die Verbindung mit:

claude mcp list

In Claude Code zeigt /mcp den Serverstatus und die verfügbaren Tools.

Der Befehl schreibt die Verbindung in deine lokale Claude-Code-Konfiguration. Wenn du die API-Key-Variante nutzt, speichere den Key nur als lokales Secret und nicht in einem geteilten Projekt.

Beispiel-Fragen an den Client

Nachdem der Server verbunden ist, kannst du dem Client normale Aufgaben geben. Gute Prompts nennen Ziel, Filter und gewünschtes Ausgabeformat:

Suche private iPhone 15 Angebote im Umkreis von 25 km um Berlin.
Lade Details für die 5 günstigsten Treffer nach und gib mir eine Tabelle mit Preis, Standort, Versand, Verkäufer und URL.
Finde Sofas bis 300 EUR in München, nur mit Bildern.
Markiere auffällige Angebote und erkläre kurz, warum sie interessant sein könnten.

Der Client entscheidet dann selbst, ob er nur search_kleinanzeigen braucht oder zusätzlich Details, Verkäuferprofile, Verkäufer-Inserate, Kategorien oder Standorte nachladen sollte.

Sicherheit und Grenzen

MCP gibt deinem KI-Client Zugriff auf die Kleinanzeigen-Werkzeuge, nicht auf dein ganzes Konto. Beim Login im Browser muss dein API-Key nicht kopiert werden. Wenn du die API-Key-Variante nutzt, bleibt der Key in deinem MCP-Client.

Der MCP Server speichert keine Inserate und ersetzt keinen Webhook. Er ist für interaktive Recherche gedacht. Für produktive Entscheidungen solltest du wichtige Ergebnisse mit ad_id, Preis, URL und Zeitpunkt ausgeben lassen und bei Bedarf selbst prüfen.

Was dein MCP Client können muss

Dein MCP-Client muss Online-MCP-Server verbinden können. Für die einfachste Einrichtung sollte er den Login im Browser unterstützen. Wenn nicht, muss er einen API-Key mitsenden können:

Authorization: Bearer klaz_live_...

Wenn dein Client weder den Login noch API-Keys für MCP-Server erlaubt, kannst du diesen MCP Server dort aktuell nicht direkt verbinden. Nutze in dem Fall die API oder einen MCP-Client, der eine der beiden Anmeldearten unterstützt.

Häufige Fehler

ProblemUrsacheLösung
401 MCP_AUTH_REQUIREDKein Login und kein API-Key gesetztLogin im MCP-Client starten oder Authorization: Bearer klaz_live_... setzen
401 API_KEY_INVALIDKey falsch, rotiert oder deaktiviertKey im Dashboard prüfen oder rotieren
401 MCP_OAUTH_INVALID_TOKENLogin ist abgelaufen oder wurde widerrufenLogin im Client erneut starten
402 INSUFFICIENT_CREDITSZu wenig GuthabenCredits kaufen oder Plan upgraden
403 MCP_ORIGIN_NOT_ALLOWEDVerbindung kommt aus einer nicht erlaubten UmgebungClient-Einstellung prüfen oder Support kontaktieren
Client findet keine ToolsMCP Server nicht korrekt verbundenURL und Login-Status im Client prüfen

Webhooks

Lass dir neue Inserate automatisch an deinen Server schicken, sobald sie auf Kleinanzeigen erscheinen — passend zu deinen Filtern, im gewählten Intervall.

Jedes Inserat erreicht dich genau einmal pro Webhook. Auch wenn ein Inserat noch tagelang in der Suche steht, schicken wir es nicht erneut.

Tarife

Webhooks haben ihr eigenes Abo. Dein API-Guthaben und dein Rate-Limit bleiben davon unberührt.

TarifIntervallPreis netto
Webhook Pulse60 Sekunden39 EUR / Monat
Webhook Flow30 Sekunden79 EUR / Monat
Webhook Stream10 Sekunden229 EUR / Monat
Webhook Realtime3 Sekunden749 EUR / Monat

Ein Abo entspricht einem aktiven Webhook mit einem Suchfilter und einer Ziel-URL.

Filter

Webhooks nutzen genau die Filter, die du auch von der Live-Suche kennst:

GET /api/v2/kleinanzeigen/search

Verfügbar sind unter anderem q, category_id, location_id, distance, min_price, max_price, picture_required, buy_now_only, shippable, ad_type, poster_type, latitude, longitude sowie kategoriespezifische attr[...]-Werte. ad_type=OFFER ist die normale Angebotssuche und wird nicht extra an Kleinanzeigen gesendet. Nur ad_type=WANTED wird als Gesuch-Filter weitergereicht.

Lieferung

Sobald wir ein neues Inserat finden, schicken wir dir einen POST an deine Ziel-URL.

Header:

X-Klaz-Webhook-Id: <webhook_id>
X-Klaz-Delivery-Id: <delivery_id>
X-Klaz-Timestamp: 2026-05-09T12:00:00.000Z
X-Klaz-Signature: v1=<hex_hmac>

Payload:

{
  "event": "kleinanzeigen.search.ads_found",
  "webhook_id": "uuid",
  "delivery_id": "uuid",
  "created_at": "2026-05-09T12:00:00.000Z",
  "query": {
    "q": "sofa",
    "location_id": "3331",
    "distance": "25"
  },
  "data": {
    "meta": {
      "source": "live",
      "interval_seconds": 30,
      "dedupe": "new_ad_ids_only"
    },
    "ads": []
  }
}

data.ads hat dasselbe Format wie die Antwort der Live-Such-API.

Signatur prüfen

So weißt du, dass eine Lieferung wirklich von uns stammt: Wir hängen jeder Anfrage einen HMAC-SHA256 als Header an, gebildet aus

timestamp + "." + raw_body

mit deinem Webhook-Signing-Secret als Schlüssel. Das Secret findest du jederzeit im Dashboard und kannst es bei Bedarf rotieren.

Beispiel in Node.js:

import crypto from "node:crypto";

function verifyKlazWebhook({
  rawBody,
  timestamp,
  signature,
  secret,
}: {
  rawBody: string;
  timestamp: string;
  signature: string;
  secret: string;
}) {
  const expected =
    "v1=" +
    crypto
      .createHmac("sha256", secret)
      .update(`${timestamp}.${rawBody}`)
      .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

Test schicken

Im Dashboard kannst du jederzeit eine Testlieferung auslösen. Sie ist signiert wie eine echte Lieferung und enthält keine Inserate, damit du deinen Endpunkt und die Signaturprüfung in Ruhe einspielen kannst.

Fehler, Credits und Limits

Die API soll für deine Anwendung vorhersehbar sein: ungültige Requests verbrauchen keine Credits, erfolgreiche Requests werden nach Aktion berechnet, und fehlgeschlagene Live-Anfragen werden automatisch erstattet.

Fehlerantwort

Jede Fehlerantwort enthält ein maschinenlesbares error_code und eine message für Menschen. Bei Validierungsfehlern listet errors die betroffenen Felder. Bei manchen Fehlern liefert data zusätzliche Hinweise (z. B. fehlende Credits oder weiterführende Links).

{
  "success": false,
  "error_code": "INVALID_PARAMETERS",
  "message": "Invalid request parameters",
  "errors": {
    "min_price": ["min_price must be less than or equal to max_price"]
  },
  "request_id": "req_..."
}

Statuscodes

  • 400: Ungültige Parameter, ungültige Pfad-ID oder ein vom Upstream zurückgewiesener Request.
  • 401: klaz_key fehlt oder ist ungültig.
  • 402: Nicht genug Credits.
  • 404: Ressource wurde upstream nicht gefunden.
  • 429: Planlimit erreicht oder Kleinanzeigen selbst hat das Limit ausgelöst.
  • 500: Unerwarteter Serverfehler.
  • 502: Kleinanzeigen hat abgelehnt oder ist temporär nicht verfügbar.
  • 504: Timeout bei der Live-Anfrage.

Error Codes

Diskriminiere im Client auf error_code — die Codes sind stabil, während sich die message-Texte ändern können.

error_codeStatusBedeutung
INVALID_PARAMETERS400Validierung fehlgeschlagen. errors enthält die Feldfehler.
INVALID_AUTH_CONTEXT400Auth-Header technisch fehlerhaft. Prüfe klaz_key.
API_KEY_MISSING401Kein klaz_key Header gesetzt. data.signup_url führt zur Anmeldung.
API_KEY_INVALID401Schlüssel unbekannt oder Account inaktiv. Neuen Schlüssel im Dashboard erzeugen.
INSUFFICIENT_CREDITS402Aktion zu teuer. data.required_credits und data.available_credits sind gesetzt; data.buy_credits_url und data.upgrade_url führen zur Abrechnung.
UPSTREAM_BAD_REQUEST400Kleinanzeigen hat den Request zurückgewiesen.
UPSTREAM_NOT_FOUND404Inserat, Verkäufer, Kategorie oder Standort existiert dort nicht (mehr).
UPSTREAM_RATE_LIMITED429Kleinanzeigen drosselt. Kurz warten und erneut versuchen — kein Plan-Upgrade nötig.
PLAN_RATE_LIMIT_EXCEEDED429Dein per-Minute-Limit ist erreicht. data.upgrade_url zeigt auf die Abrechnung.
INGRESS_RATE_LIMIT_EXCEEDED429Globales IP-Limit erreicht (sehr hoch angesetzt, normalerweise nur bei sehr aggressivem Traffic).
UPSTREAM_UNAVAILABLE502Kleinanzeigen ist gerade nicht erreichbar. Wird automatisch retryed.
UPSTREAM_TIMEOUT504Antwort kam nicht rechtzeitig. Erneut versuchen.
INTERNAL_ERROR500Unerwarteter Fehler bei uns. request_id mitsenden, wenn du Support kontaktierst.

Bei INSUFFICIENT_CREDITS enthält data die Credit-Zähler (required_credits, available_credits) plus buy_credits_url, upgrade_url, plans_url. Bei API_KEY_MISSING, API_KEY_INVALID und PLAN_RATE_LIMIT_EXCEEDED enthält data weiterführende URLs (signup_url, api_keys_url, docs_url, upgrade_url, plans_url), damit du Endnutzer:innen direkt zum richtigen Schritt schicken kannst.

Credit-Kosten

Kosten:

  • Live-Suche: 1 Credit.
  • Verkäuferprofil: 1 Credit.
  • Verkäufer-Inserate: 2 Credits.
  • Inseratdetails: 1 Credit.
  • Inseratstatus: 1 Credit.
  • Views zusätzlich laden: 1 Credit.
  • Kategorien: 1 Credit.
  • Kategorie-Metadaten: 1 Credit.
  • Standorte: 1 Credit.

include_views=true addiert den Views-Credit zur jeweiligen Anfrage. Ein Detailabruf mit Views kostet also 2 Credits, ein Statusabruf mit Views kostet 2 Credits.

Live-Daten

Die API liefert aktuelle Daten aus der Live-Abfrage. Sie ist nicht als historisches Archiv gedacht und liefert keine gespeicherten Suchergebnisse aus früheren Läufen.

Verbindung und Stabilität

Du musst keine Proxy-Daten, Cookies oder Kleinanzeigen-spezifische Verbindungseinstellungen konfigurieren. Wir kümmern uns um Routing, Timeouts, Normalisierung und retryfähige Verbindungsfehler.

Aktuelle Einschränkungen

Die erste v2-Version konzentriert sich auf Live-Abfragen. Gespeicherte Suchhistorie, Harvesting und Raw-Antworten sind nicht Teil dieser API. sort_type ist aktuell deaktiviert: Die REST API lehnt den Parameter mit INVALID_PARAMETERS ab, das MCP-Tool bewirbt ihn nicht und entfernt ihn defensiv, falls ein Client ihn trotzdem mitsendet.