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.
- Site
- Vinted, Germany
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- 8dd0eaf315ab…
Requests
sent from your browser, in order- 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 agentorderenum "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 agentcurrencyany
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 }