API

Vinted API: Second-Hand-Angebote von vinted.de mit Preis, Größe und Zustand

Einen offiziellen Zugang, über den sich der Vinted-Katalog per Code abfragen ließe, gibt es nicht. Diese API liest vinted.de so, wie die Seite ohne Anmeldung aussieht, und gibt Titel, Marke, Größe, Zustand, Fotos und Preis jedes Angebots als JSON zurück. Der Preis kommt doppelt: einmal so, wie er im Inserat steht, und einmal als Gesamtbetrag inklusive Käuferschutz-Gebühr. Versandkosten stecken in keinem der beiden Werte. Für Vinted-Pro-Händler, die Artikel hochladen oder Bestellungen abwickeln wollen, ist das die falsche Schnittstelle: Hier wird nur gelesen, was öffentlich auf vinted.de steht.

Endpunkte

endpointWas zurückkommtPflicht
catalog_searchSuche nach Stichwort und/oder Filtern: Kategorie, Größe, Farbe, Marke, Preisspanne. Vier Sortierungen (neueste zuerst, Relevanz, Preis auf- und absteigend), bis zu 96 Artikel pro Seite. Jede Zeile trägt `price`, `total_item_price` und `service_fee` als eigene Felder, dazu Größe und Zustand mit den deutschen Bezeichnungen der Seite („Sehr gut“, „Neu, mit Etikett“).alle optional
item_detailEin Artikel über id oder URL: Beschreibung, alle Fotos, Kategorie (etwa „Damen Biker- & Racer-Jacken“), Farbe, Material, ob er reserviert ist und ob er sich sofort kaufen lässt (`can_buy`, `instant_buy`).alle optional
sellerDas öffentliche Profil eines Mitglieds: Bewertung, Zahl der positiven, neutralen und negativen Bewertungen, Anzahl der Artikel und Land (`country_code`).id
seller_itemsDer Kleiderschrank eines Mitglieds: die eingestellten Artikel mit Hochladezeitpunkt, Favoriten, Aufrufen und den Statusfeldern (reserviert, verkauft, verborgen).id
seller_feedbackDie Bewertungen, die ein Mitglied erhalten hat, seitenweise: Bewertungstext, Sterne und Datum.id
categoriesDer Kategoriebaum von vinted.de mit deutschen Namen (Damen › Kleidung › Jacken & Mäntel …) und den ids für `catalog_ids`.alle optional
sizesDie Größengruppen mit ids für `size_ids`, in der Schreibweise der Seite (S / 36 / 8, M / 38 / 10 …).alle optional
colorsDie Farben mit id, deutschem Namen (Schwarz, Grau, Weiß …) und Hex-Code, für `color_ids`.alle optional
countriesDie Vinted-Länder mit ISO-Code und Währung.alle optional

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

Funktionierendes Beispiel

Die Käuferschutz-Gebühr war bei allen 40 Artikeln, die wir am 26. Oktober abgefragt haben (20 aus dieser Suche, 20 mit dem Markenfilter Zara), genau 0,70 € plus 5 % des Artikelpreises: 0,90 € auf eine Jacke für 4 €, 3,70 € auf eine für 60 €. Wer Preise mit anderen Plattformen vergleicht, nimmt deshalb `total_item_price`; wer den Preis aus dem Inserat braucht, `price`. Bei „Lederjacke“ meldete Vinted 960 Treffer, das ist zugleich die Obergrenze pro Filterkombination.

Anfrage
curl -X POST https://api.reefapi.com/vinted/v1/catalog_search \
  -H "x-api-key: IHR_SCHLUESSEL" \
  -H "content-type: application/json" \
  -d '{"query": "Lederjacke", "tld": "de", "per_page": 20, "order": "newest_first"}'
Antwort (gekürzt)
{
  "ok": true,
  "data": {
    "items": [
      ...
      {
        "id": 10540741771,
        "title": "Stradivarius Lederjacke Beige Bikerjacke Gr. L (fällt wie M aus)",
        "url": "/items/10540741771-stradivarius-lederjacke-beige-bikerjacke-gr-l-fallt-wie-m-aus",
        "price": { "amount": 10.0, "currency": "EUR" },
        "total_item_price": { "amount": 11.2, "currency": "EUR" },
        "service_fee": { "amount": 1.2, "currency": "EUR" },
        "brand": "Stradivarius",
        "size": "L",
        "condition": "Sehr gut",
        "uploaded_ts": null,
        "promoted": false,
        ...
      },
      {
        "id": 10540735123,
        "title": "Bikerjacke aus Schafleder",
        "price": { "amount": 50.0, "currency": "EUR" },
        "total_item_price": { "amount": 53.2, "currency": "EUR" },
        "service_fee": { "amount": 3.2, "currency": "EUR" },
        "brand": "OAKWOOD",
        "size": "M",
        "condition": "Gut",
        ...
      },
      {
        "id": 10540729932,
        "title": "Lederjacke NEU",
        "price": { "amount": 25.0, "currency": "EUR" },
        "total_item_price": { "amount": 26.95, "currency": "EUR" },
        "service_fee": { "amount": 1.95, "currency": "EUR" },
        "brand": "H&M",
        "size": "M",
        "condition": "Neu, mit Etikett",
        ...
      },
      ...
    ],
    "pagination": { "current_page": 1, "per_page": 20, "total_entries": 960, "total_pages": 48 },
    "tld": "de"
  },
  "meta": {
    "record_count": 20,
    "tld": "de",
    "total_entries": 960,
    "window_cap": 960,
    "warnings": ["source_fields_unavailable: uploaded_ts, seller.login, seller.profile_url, is_visible, stats_visible, view_count, is_reserved, ..."],
    "charged_credits": 2,
    "cache_hit": false,
    "mode": "live"
  }
}

Vinted-Scraper in Python: zweimal war die Suche einfach weg

Wer Vinted mit Python ausliest, stützt sich häufig auf die interne Such-Schnittstelle der Seite. 2026 hat Vinted sie zweimal entfernt. Am 14. September verschwand `/api/v2/catalog/items`, einen Tag lang endete jede Suche mit NOT_FOUND. Am 9. Oktober traf es die Ersatzroute: Innerhalb von fünf Minuten wurde aus einer normalen Trefferliste Vinteds gewöhnliche „Page not found“-Seite, nachgemessen in drei Ländern, darunter Deutschland. Kein Captcha, keine Sperre; die Route gab es schlicht nicht mehr.

Seitdem liest die API die Katalogseite, die vinted.de selbst ausliefert. Die ist rund 3,8 MB groß statt 150 KB über die alte Route, und manches steht dort gar nicht drin: Hochladezeitpunkt, Aufrufe, Benutzername und Profiladresse des Verkäufers und die Statusfelder (reserviert, verkauft, verborgen). In `catalog_search` kommen diese Felder als null zurück und werden in `meta.warnings` aufgezählt, statt geschätzt zu werden; Hochladezeitpunkt, Aufrufe und Status liefert `seller_items` weiterhin. Wer die API schon nutzte, musste an seinem Code nichts ändern: Parameter und Feldnamen blieben dieselben.

Eine stille Falle fiel uns dabei an den Statusfeldern auf: `stats_visible` klingt nach „Artikel sichtbar“, stand aber bei einem kaufbaren, nicht geschlossenen Artikel auf false. Ob ein Artikel noch zu haben ist, sagen `is_closed`, `is_reserved` und `is_hidden`. Ein Skript, das das falsche Feld nimmt, sortiert aktive Angebote aus.

Das Skript selbst ist schnell geschrieben. Die Arbeit beginnt an dem Tag, an dem Vinted umbaut und die Auswertung trotzdem weiterläuft, nur eben mit leeren oder falschen Spalten.

Grenzen und ehrliche Hinweise

  • Wir betreiben diese API ohne Beteiligung von Vinted: kein offizieller Zugang, keine Partnerschaft.
  • Ohne `"tld": "de"` geht die Anfrage an vinted.fr, das ist der Standardwert.
  • Fünf Hilfs-Endpunkte funktionieren derzeit nicht (gemessen am 26. Oktober 2026 auf vinted.de, je zwei bis drei Versuche, alle mit 0 Credits verbucht): `autocomplete` und `conditions` antworten mit UPSTREAM_HTTP, `catalog_filters` mit NOT_FOUND, `similar` mit TARGET_BLOCKED. `brand_search` antwortet zwar, übergeht aber den Suchbegriff: „stradivarius“, „jack wolfskin“ und „superdry“ ergaben dieselben 12 Marken. Deshalb stehen sie oben nicht in der Tabelle.
  • Solange das so ist, lassen sich Zustands- und Material-ids nicht nachschlagen. `brand_ids` funktioniert mit ids, die man schon hat: 12 (Zara) lieferte 20 von 20 Zara-Artikeln.
  • In `item_detail` fehlt die Größe zurzeit: `size` war bei allen drei geprüften Artikeln leer, und im Attribut „Größe“ stand der Text „Zustand“; ein eigenes Zustandsattribut fehlte. Größe und Zustand mit deutschen Bezeichnungen liefert verlässlich die Trefferzeile aus `catalog_search`; `item_detail` nennt den Zustand nur im schema.org-Format (`UsedCondition`, `NewCondition`), und `url` ist dort null.
  • Pro Filterkombination gibt Vinted höchstens 960 Treffer heraus (`total_entries` bleibt bei 960). Wer mehr braucht, schneidet enger: nach Kategorie, Größe oder Preisspanne.
  • Nicht jeder Treffer passt zum Suchbegriff: Unter den 20 neuesten für „Lederjacke“ waren eine Fellweste und ein Pullover.
  • Versandkosten liefert kein Endpunkt. `total_item_price` enthält nur die Käuferschutz-Gebühr.
  • In den Trefferzeilen von `catalog_search` sind Hochladezeitpunkt, Aufrufe und Statusfelder null (Liste in `meta.warnings`). Ob ein Artikel reserviert oder verkauft ist, zeigt `seller_items`, für einen einzelnen Artikel auch `item_detail` (`is_reserved`, `can_buy`).
  • `catalog_search` und `item_detail` kosten 2 Credits pro Aufruf, alle anderen Endpunkte 1. Zwischengespeichert wird nichts: Auch Kategorien, Größen, Farben und Länder holt jeder Aufruf frisch von vinted.de.