Install

Search second-hand fashion and items on Vinted.

Searches Vinted (Germany) second-hand listings like the site's own catalogue: title, brand, size, condition, item price, the total including Vinted's buyer protection fee, and the item link. Optional price range and cheapest-first sorting.

No reports yetRead-only, no login
Site
Vinted, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
8dd0eaf315ab…

Requests

sent from your browser, in order
  1. 1GET/catalog?currency&order&price_from&price_to&search_textServer-rendered catalogue page (Next.js app router, ~3.6 MB). The old JSON API /api/v2/catalog/items now answers 404.

Parameters

from your agent
orderenum "relevance" | "price_low_to_high" = "relevance"
price_fromnumberEUR
price_tonumberEUR
querystringrequiredWhat to search for, e.g. 'winterjacke 122', 'nike air max 42'

Returns

to your agent
currencyany
itemsobject[]brand, condition, id, price_eur, size, title, total_eur, url
querystring

Where it can send

  • www.vinted.de

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • length(output.items) > `10`
  • length(output.items[?price_eur > `40`]) == `0`
  • output.items[0].total_eur >= output.items[0].price_eur
  • starts_with(output.items[0].url, 'https://www.vinted.de/items/')

Raw recipe

Served as canonical JSON from /api/v1/recipes/vinted.de/search-items, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/vinted.de/search-items | shasum -a 256
# 8dd0eaf315ab81072f6703899b942956b299b3f10736522f1b9f76844cde86eb
vinted.de/search-items.json, v1
{
  "description": "Searches Vinted (Germany) second-hand listings like the site's own catalogue: title, brand, size, condition, item price, the total including Vinted's buyer protection fee, and the item link. Optional price range and cheapest-first sorting.",
  "effect": "read",
  "id": "vinted.de/search-items",
  "keywords": [
    "vinted",
    "second hand",
    "gebraucht",
    "kleidung",
    "secondhand mode",
    "flohmarkt",
    "kinderkleidung",
    "used clothes",
    "thrift",
    "preloved",
    "resale fashion"
  ],
  "output": {
    "schema": {
      "properties": {
        "currency": {
          "const": "EUR"
        },
        "items": {
          "items": {
            "properties": {
              "brand": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "condition": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "id": {
                "type": "string"
              },
              "price_eur": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "size": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": "string"
              },
              "total_eur": {
                "description": "Including Vinted's buyer protection fee (shipping extra)",
                "type": [
                  "number",
                  "null"
                ]
              },
              "url": {
                "format": "uri",
                "type": "string"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "query": {
          "type": "string"
        }
      },
      "required": [
        "query",
        "items"
      ],
      "type": "object"
    },
    "value": "{query: params.query, currency: 'EUR', items: steps.catalog.items[?href != `null` && alt != `null`].{id: replace(testid, 'product-item-id-', ''), title: contains(alt, ', Marke: ') && split(alt, ', Marke: ')[0] || split(alt, ', Zustand: ')[0], brand: contains(alt, ', Marke: ') && split(split(alt, ', Marke: ')[1], ', Zustand: ')[0] || `null`, condition: contains(alt, ', Zustand: ') && split(split(alt, ', Zustand: ')[1], ', Größe: ')[0] || `null`, size: contains(alt, ', Größe: ') && split(split(alt, ', Größe: ')[1], ', ')[0] || `null`, price_eur: price_text && to_number(replace(replace(split(trim(replace(price_text, 'inkl.', '')), ' ')[0], '.', ''), ',', '.')) || `null`, total_eur: total_text && to_number(replace(replace(split(trim(replace(total_text, 'inkl.', '')), ' ')[0], '.', ''), ',', '.')) || `null`, url: join('', ['https://www.vinted.de', split(href, '?')[0]])}}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "order": {
        "default": "relevance",
        "enum": [
          "relevance",
          "price_low_to_high"
        ],
        "type": "string"
      },
      "price_from": {
        "description": "EUR",
        "minimum": 0,
        "type": "number"
      },
      "price_to": {
        "description": "EUR",
        "minimum": 1,
        "type": "number"
      },
      "query": {
        "description": "What to search for, e.g. 'winterjacke 122', 'nike air max 42'",
        "maxLength": 100,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "query"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "spikes/vinted.md. The JSON catalogue API (/api/v2/catalog/items) now returns a 404 page, also in-browser; the catalogue page is server-rendered with 96 product cards. Card fields come from data-testid hooks and the image alt text ('<title>, Marke: <brand>, Zustand: <condition>, Größe: <size>, <price>, <total>'); Marke is missing when the seller set no brand. Cloudflare in front; neither curl nor the in-page fetch was challenged.",
    "recorded_at": "2026-11-07T12:22:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "DE",
    "id": "vinted.de",
    "language": "de",
    "login_url": "https://www.vinted.de/member/signup/select_type",
    "name": "Vinted",
    "origin": "https://www.vinted.de",
    "origins": [
      "https://www.vinted.de"
    ]
  },
  "steps": [
    {
      "description": "Server-rendered catalogue page (Next.js app router, ~3.6 MB). The old JSON API /api/v2/catalog/items now answers 404.",
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "html_items": {
          "items": {
            "fields": {
              "alt": {
                "attr": "alt",
                "selector": "img"
              },
              "href": {
                "attr": "href",
                "selector": "a[href*=\"/items/\"]"
              },
              "price_text": {
                "selector": "[data-testid$=\"--price-text\"]"
              },
              "testid": {
                "attr": "data-testid",
                "selector": ":scope"
              },
              "total_text": {
                "selector": "[data-testid*=\"breakdown\"]"
              }
            },
            "max": 96,
            "selector": "[data-testid^=\"product-item-id-\"]:not([data-testid*=\"--\"])"
          }
        }
      },
      "id": "catalog",
      "parse": "html",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "currency": "EUR",
          "order": "{{params.order}}",
          "price_from": "{{params.price_from}}",
          "price_to": "{{params.price_to}}",
          "search_text": "{{params.query}}"
        },
        "url": "/catalog"
      }
    }
  ],
  "task": "Search second-hand fashion and items on Vinted",
  "tos": {
    "notes": "Vinted's terms prohibit scraping and automated collection of listings. One user-initiated search page at a time from the user's own browser. Buying and messaging stay on vinted.de.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.items) > `10`",
      "length(output.items[?price_eur > `40`]) == `0`",
      "output.items[0].total_eur >= output.items[0].price_eur",
      "starts_with(output.items[0].url, 'https://www.vinted.de/items/')"
    ],
    "example_params": {
      "order": "price_low_to_high",
      "price_to": 40,
      "query": "winterjacke"
    },
    "max_ms": 6000
  },
  "version": 1
}