API

ricardo.ch API: Auktionen, Sofortkauf-Preise und Gebote aus der Schweiz als JSON

Was auf ricardo.ch ohne Login zu sehen ist, kommt hier als JSON zurück: Titel, Zustand, das nächste Mindestgebot und den Sofortkaufpreis in Franken, die Zahl der Gebote, das Auktionsende, Versandkosten und den Ort für die Abholung. Mit `article/bids` kommt zu jeder Auktion die ganze Gebotsliste dazu. Gesucht wird in der Sprache der Seite: `language` de, fr oder it, Standard ist de. Mit `zip_code` und `radius` lässt sich die Suche auf einen Umkreis legen, etwa 20 Kilometer um 8004 Zürich. Für Verkäuferinnen und Verkäufer, die Inserate aufschalten oder Verkäufe abwickeln, ist die Schnittstelle nicht gemacht: Sie liest nur und kann auf ricardo.ch weder bieten noch etwas einstellen.

Endpunkte

endpointWas zurückkommtPflicht
searchArtikel nach Stichwort und/oder Kategorie, 60 pro Seite: Artikel-ID, Titel, Bild, Zustand (new, like_new, used, defective, antique), Angebotsart (auction, fixed_price, auction_with_buynow), nächstes Mindestgebot (`next_bid_price`), Sofortkaufpreis, Anzahl Gebote, Start und Ende, Versandarten mit Kosten in CHF, Abholort mit Postleitzahl, Marke und Grösse, falls angegeben. Filter für Angebotsart, Zustand, Versand oder Abholung, Preisspanne, Postleitzahl mit Umkreis, Verkäufertyp und «nur mit Geboten»; acht Sortierungen, darunter «endet bald» und «Preis inkl. Versand». Bei einem Tippfehler kommt ricardos Korrekturvorschlag in `spellcheck` mit.alle optional
article/bidsDer Stand einer Auktion: aktuelles Höchstgebot, Startpreis, nächstes Mindestgebot, Gebotsschritt, Anzahl Gebote, Restzeit in Sekunden, offen oder beendet, und jedes einzelne Gebot mit Betrag, Zeitpunkt, maskiertem Bieternamen sowie den Kennzeichen «führend» und «automatisches Gebot».article_id
seller/articlesWas ein bestimmter Verkäufer gerade anbietet, abgefragt über seinen ricardo-Benutzernamen; Zeilen, Filter und Sortierungen wie bei `search`.seller
categoriesDer Kategoriebaum in der gewählten Sprache: ID, Name, Slug und übergeordnete Kategorie. Mit `top_level` nur die 28 Hauptkategorien, von «Antiquitäten & Kunst» bis «Wein & Genuss».alle optional
suggestricardos eigene Suchvorschläge zum Anfang eines Begriffs, wo vorhanden mit der passenden Kategorie («velo» → «Velos», `velos-82249`).query

Jeder Aufruf wird in Credits abgerechnet. Fehlgeschlagene und blockierte Aufrufe sind kostenlos.

Funktionierendes Beispiel

`next_bid_price` ist nicht das Höchstgebot, sondern der Betrag, den man als Nächstes mindestens bieten muss. Beim defekten Totem-Rennvelo unten steht in der Suche 32 Franken; `article/bids` für denselben Artikel zeigt ein Höchstgebot von 31 Franken nach 13 Geboten, Startpreis 1 Franken, Gebotsschritt 1 Franken. Hat eine Auktion noch keine Gebote, ist `next_bid_price` der Startpreis, so beim Centurion-Velo: 149 Franken Startpreis, sofort kaufen für 299 Franken. Von 59 Treffern im Umkreis von 20 Kilometern um 8004 liefen 31 als reine Auktion, 26 als Auktion mit Sofortkauf und nur 2 zum Festpreis; ein «Top-Angebot» wurde aussortiert (`sponsored_dropped`).

Anfrage
curl -X POST https://api.reefapi.com/ricardo/v1/search \
  -H "x-api-key: IHR_API_SCHLUESSEL" \
  -H "content-type: application/json" \
  -d '{"query": "Rennvelo", "zip_code": "8004", "radius": 20, "language": "de"}'
Antwort (gekürzt)
{
  "ok": true,
  "data": {
    "articles": [
      ...
      {
        "article_id": "1333672584",
        "title": "Vintage Rennvelo Centurion",
        "url": "https://www.ricardo.ch/de/a/1333672584/",
        "category_id": 82249,
        "condition": "used",
        "currency": "CHF",
        "offer_type": "auction_with_buynow",
        "next_bid_price": 149,
        "current_bid": null,
        "bids_count": 0,
        "buy_now_price": 299,
        "end_date": "2026-11-02T11:50:00Z",
        "shipping": [
          { "method": "pickup", "cost": 0, "currency": "CHF", "zip_code": "8105", "city": "Regensdorf" }
        ],
        "co2_savings": "370.0 kg",
        "is_promoted": false,
        ...
      },
      ...
      {
        "article_id": "1333536172",
        "title": "Rennvelo Totem Race (Defekt)",
        "condition": "defective",
        "currency": "CHF",
        "offer_type": "auction",
        "next_bid_price": 32,
        "current_bid": null,
        "bids_count": 13,
        "has_bids": true,
        "buy_now_price": null,
        "end_date": "2026-11-01T13:20:00Z",
        "brand": "Totem",
        "shipping": [
          { "method": "pickup", "cost": 0, "currency": "CHF", "zip_code": "8050", "city": "Zürich" }
        ],
        "highlight": "popular",
        ...
      },
      ...
    ],
    "count": 59,
    "total_results": 761,
    "sponsored_dropped": 1,
    "page": 1,
    "page_size": 60,
    "has_more": true
  },
  "meta": {
    "record_count": 59,
    "charged_credits": 2,
    "cache_hit": false,
    "mode": "live"
  }
}

ricardo.ch scrapen: vier Werte, die anders sind, als sie aussehen

Erstens der Preis in der Trefferliste. Das Feld, das wie das aktuelle Gebot aussieht, ist das nächste Mindestgebot. Beim Bau der Engine haben wir es am selben Artikel gegengeprüft: In der Liste standen 31 Franken, das Höchstgebot lag bei 30 Franken. Dazu kommt, dass ricardos Gebotsdaten Beträge in Rappen führen (3000 sind 30 Franken), die Trefferliste dagegen in Franken. Wer beide Quellen ungeprüft zusammenführt, liegt entweder um einen Gebotsschritt oder um den Faktor 100 daneben.

Zweitens ein Filter, der stillschweigend nichts tut. Der naheliegende Parametername für den Verkäufertyp wurde von ricardo angenommen und ignoriert: Die Suche lieferte ungefiltert 65'605 Artikel. Erst mit dem richtigen Namen kamen 8'836. Eine Fehlermeldung gab es in keinem der beiden Fälle.

Drittens das Blättern. Ein naheliegender zweiter Seitenparameter wird von ricardo zwar in der Antwort bestätigt, liefert aber wieder die erste Seite: 59 von 59 Artikeln waren identisch. Nur `page` ergibt tatsächlich die nächste Seite. Ein Skript, das so durch die Resultate blättert, sammelt dieselben 59 Artikel immer wieder ein und hält sie für neue.

Viertens die «Top-Angebote». Das sind bezahlte Plätze ganz oben, die sich an keine Sortierung halten. Bei jeder Sortierung, die wir beim Bau gemessen haben, stand ein solches Angebot auf Platz 1. Wer nach «endet bald» sortiert und die erste Zeile als nächstes Auktionsende speichert, speichert also eine Werbeplatzierung. Hier werden sie standardmässig weggelassen und gezählt; mit `include_sponsored: true` kommen sie mit `is_promoted: true` zurück.

Für eine einzelne Suche fällt das kaum ins Gewicht. Wer aber über Wochen Schweizer Preise für Velos, Uhren oder Sammelobjekte auswertet, baut auf genau diesen vier Feldern auf.

Grenzen und ehrliche Hinweise

  • Die Schnittstelle ist inoffiziell: ricardo hat sie nicht in Auftrag gegeben, und mit dem Marktplatz besteht keine Kooperation.
  • Einen Endpunkt für die einzelne Artikelseite gibt es nicht. Beschreibung, alle Fotos und die Bewertung des Verkäufers stehen nur dort, und diese Seite liest die API nicht; geliefert wird, was Trefferliste und Gebotsdaten enthalten.
  • Beendete und verkaufte Artikel lassen sich nicht suchen. Für eine Auswertung erzielter Verkaufspreise auf ricardo.ch eignet sich die API deshalb nicht; `search` zeigt nur laufende Angebote.
  • In der Trefferliste ist `current_bid` immer null. Das Höchstgebot liefert `article/bids`, dort umgerechnet von Rappen in Franken.
  • Der Filter `offer_type: fixed_price` bedeutet bei ricardo «Sofortkauf möglich» und schliesst Auktionen mit Sofortkaufpreis ein: Beim Bau hatten 59 von 59 Treffern einen Sofortkaufpreis, 47 davon waren zugleich Auktionen.
  • Die Zeilen enthalten nur eine numerische `seller_id`. `seller/articles` braucht dagegen den Benutzernamen, und die beiden lassen sich nicht miteinander verknüpfen. Eine Gesamtbewertung des Verkäufers liefert keine der Abfragen.
  • EAN, GTIN oder Artikelnummern des Herstellers veröffentlicht ricardo nicht.
  • Kategorie-Slugs hängen von der Sprache ab: `velos-82249` gilt für de, auf Italienisch heisst dieselbe Kategorie `biciclette-82249`. Wer die numerische ID übergibt, muss sich darum nicht kümmern.
  • Beträge gibt es nur in Franken. Bieternamen zeigt ricardo selbst nur maskiert (zwei Buchstaben, dann Sternchen), und genau so kommen sie zurück.
  • Kosten pro Aufruf: `search` und `seller/articles` 2 Credits, `article/bids` und `suggest` 1, `categories` 3.
  • `article/bids` zeigt den Stand im Moment des Abrufs. Wer den Verlauf einer Auktion bis zum Schluss braucht, ruft den Endpunkt mehrmals auf und legt jeden Stand ab.