Tony Wang6 min readHow to Scrape Vinted in 2026 (API & Python)
Three ways to scrape Vinted listings, items, and members in 2026 — DIY Python, no-code tools, or a structured API — what each returns and the legal basics.
The fastest way to scrape Vinted in 2026 is to call a structured marketplace API that returns normalized JSON — catalog search, item detail, member profiles, brands, and categories — instead of parsing Vinted's HTML yourself. You can build a DIY scraper in Python, but per-country domains, anti-bot defenses, and price formatting make it expensive to keep working.
Vinted does not offer a general public API for third-party read access. It does run Vinted Pro Integrations, but that's an allowlisted API for Pro sellers to manage their own inventory and orders — not a way for outside teams to search or research the catalog. A structured scraping API is the practical route for resale-price research, brand tracking, and cross-market comparisons.
Why scrape Vinted data?
- Resale-price research — track what specific brands, sizes, and conditions actually sell for versus list for.
- Brand and category trend tracking — watch which brands and categories gain listing and favourite volume over time.
- Cross-country market research — Vinted runs separate locale domains (vinted.fr, vinted.de, vinted.co.uk, vinted.it, and more), so the same brand can price differently by market.
- Seller monitoring — track a specific closet's listings, ratings, and follower growth.
- AI and data pipelines — feed normalized secondhand-fashion listings into pricing models, sourcing tools, or arbitrage research.
Is it legal to scrape Vinted?
Vinted's Terms and Conditions restrict automated access to the site, so scraping is a contract question with Vinted, not automatically a criminal one. In the US, courts have repeatedly held that scraping publicly accessible pages does not violate the Computer Fraud and Abuse Act, even when a site's terms forbid it (see hiQ Labs v. LinkedIn, cited below) — but a terms-of-service breach can still get an account or IP banned, and EU users are additionally covered by GDPR when personal data (like a member's name or location) is involved.
Practically:
- Collect only public catalog, item, brand, category, and member pages — no login-gated data.
- Respect robots.txt and rate limits; Vinted's robots file explicitly blocks AI-training crawlers (
ai-train=no) while allowing search indexing. - Vinted operates per-country domains — check whether your use case needs consent or disclosure requirements that vary by jurisdiction.
- Don't reuse listing photos or descriptions beyond what your use case and copyright law allow; prices, brands, and conditions are facts, but item photos and write-ups are the seller's content.
Option 1: DIY in Python (and why it breaks)
The naive approach fetches a catalog search page and parses item cards:
import csv, requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.vinted.com/catalog",
params={"search_text": "leather jacket"},
headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"},
)
soup = BeautifulSoup(resp.text, "html.parser")
rows = []
for card in soup.select("[data-testid='grid-item']"):
title = card.select_one("[data-testid='item-title']")
price = card.select_one("[data-testid='item-price']")
rows.append({"title": title.get_text(strip=True) if title else None,
"price": price.get_text(strip=True) if price else None})
with open("vinted.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=["title", "price"]); w.writeheader(); w.writerows(rows)
# ...then keep these selectors alive, handle the SPA's client-rendered content, and paginate
It works once, then the maintenance starts:
- Client-side rendering. Vinted's catalog and item pages hydrate via JavaScript, so a plain
requests.get()often returns a shell — you need a headless browser to get the real DOM. - Anti-bot defenses. Datacenter IPs get blocked or rate-limited, so you need rotating residential proxies and realistic headers.
- Per-country domains and currency. vinted.com, vinted.fr, vinted.de, vinted.co.uk, and other locale sites use different currencies and layouts for the same underlying catalog.
- Price fields. The visible price is the item price; a separate "buyer protection" fee is added at checkout — parsing "the price" means picking the right field for your use case.
- Selector churn. Vinted redesigns its grid and item pages periodically, breaking hand-written CSS selectors without notice.
Option 2: No-code / ready-made tools
Browser extensions and point-and-click scrapers can export a page of search results, but resale-price and brand-trend research means re-running the same searches on a schedule and storing history across countries. That's a recurring pipeline job, better served by an API you can call from a script or cron job than a manual export tool.
Option 3: A structured Vinted API
Crawlora's Vinted API wraps request handling, rendering, proxies, and parsing behind documented endpoints for catalog search, item detail, member profiles, brands, and categories.
curl "https://api.crawlora.net/api/v1/vinted/catalog?search_text=jacket&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
resp = requests.get(
"https://api.crawlora.net/api/v1/vinted/catalog",
headers={"x-api-key": "YOUR_API_KEY"},
params={"search_text": "jacket", "page": 1},
)
for item in resp.json()["data"]["items"]:
print(item["title"], item["price_raw"], item["brand"])
A response is normalized JSON (confirm the exact fields in the docs):
{
"code": 200,
"msg": "OK",
"data": {
"search_text": "jacket",
"page": 1,
"source_url": "https://www.vinted.com/catalog?search_text=jacket",
"items": [
{
"id": "9595406652",
"title": "Vintage leather Cabelas Women's jacket",
"url": "https://www.vinted.com/items/9595406652-vintage-leather-cabelas-womens-jacket",
"brand": "Cabela's",
"size": "L / US 12-14",
"condition": "Good",
"price_raw": "$20.00",
"total_price_raw": "$21.70",
"favourite_count": 9,
"image_url": "https://images1.vinted.net/t/01_00ebe_Runxp7FBSGM86vRdXFhYhM4A/310x430/3e52418b.webp"
}
]
}
}
Note price_raw (item price) versus total_price_raw (item price plus buyer protection) — pick the field your use case actually needs. From a search result, pull item detail, a member's profile, or browse by brand and category:
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/vinted"
item = requests.get(f"{base}/item", headers=h, params={"id": "9595406652"}).json()["data"]
member = requests.get(f"{base}/member", headers=h, params={"id": "3159465141"}).json()["data"]
brand_items = requests.get(f"{base}/brand", headers=h, params={"id": "386688", "price_from": "10", "price_to": "50"}).json()["data"]
categories = requests.get(f"{base}/categories", headers=h).json()["data"]["categories"]
catalog, brand, and category all accept price_from, price_to, order, and page, so you can filter and paginate a search, a brand's listings, or a category browse the same way.
What you can collect
- Catalog search results: title, brand, size, condition, price and total price, favourite count, and image
- Item detail: description, material, color, categories, and photos for a specific listing
- Member profiles: username, location, rating, and follower/following counts
- Brand and category browsing, each with the same price and pagination filters as catalog search
- The full brand list and category tree for building your own taxonomy
Limitations
- No third-party read API. Vinted Pro Integrations exists for allowlisted Pro sellers managing their own inventory — it isn't a research or bulk-read API, so full catalog access still means scraping.
- Locale fragmentation. Prices and currency are per-country domain; comparing markets means querying each locale separately and normalizing currency yourself.
- Price ambiguity. Item price and buyer-protection total are separate fields — decide which one your analysis needs before you aggregate.
- Anti-bot and rendering. Client-side rendering plus IP-based blocking make plain HTTP requests unreliable; a structured API handles headers, rendering, and retries behind one key.
- Media is copyrighted. Prices, brands, and conditions are facts you can collect; listing photos and descriptions carry copyright — don't republish beyond what your use case and law allow.
Where this gets used
- Resale and arbitrage research comparing list price to typical sold price by brand and category
- Secondhand-fashion market reports segmented by country or locale domain
- Seller and closet monitoring for competitive research
- Enrichment pipelines feeding brand and category catalogs into pricing or sourcing tools
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Vinted data pairs well with other resale-marketplace APIs for cross-platform price comparisons — see how to scrape StockX for sneaker and streetwear resale, how to scrape eBay for general secondhand and auction listings, how to scrape Etsy for handmade and vintage goods, how to scrape Mercari for the general secondhand-marketplace equivalent, how to scrape Poshmark for the social-selling side of the same closet-fashion market, and how to scrape Zalando for the retail-fashion counterpart across Vinted's European markets. Get started by testing the endpoint in the Playground, reading the request and response schema in the API docs, and reviewing credit costs on the pricing page. Not sure this is legal for your use case? Read Is web scraping legal in 2026? first.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does Vinted have an official public API?
Not for third-party read access. Vinted runs Vinted Pro Integrations, an allowlisted API for Pro sellers to manage their own listings, orders, and webhooks — it isn't open for outside research or bulk catalog reads, so pulling search results, brand listings, or member profiles still means scraping public pages or using a structured scraping API.
Is it legal to scrape Vinted?
Scraping publicly accessible pages is generally treated differently from unauthorized access to private accounts, and US courts have held it doesn't violate the CFAA even when a site's terms forbid it. Vinted's Terms and Conditions do restrict automated access, though, so a violation is a contract issue that can get an account or IP banned. Collect only public data, respect robots.txt, and treat this as informational, not legal advice.
Why do Vinted prices show two numbers?
The item price (price_raw) is what the seller listed; the total price (total_price_raw) adds Vinted's buyer protection fee, which is charged at checkout. Decide which field your analysis needs — item price for seller-set pricing research, total price for what a buyer actually pays.
Can I get seller or member data from a Vinted item?
Item detail responses intentionally exclude seller information. To get a seller's public profile, call the member endpoint with the seller's numeric member ID, which returns username, coarse location, rating, and follower counts — activity data like last-seen timestamps is deliberately left out.
How do I search Vinted listings by brand or category instead of keyword?
Use the brand endpoint with a numeric brand ID (from an item's brand link, or the brands list) or the category endpoint with a numeric category ID (from the categories tree). Both support the same price_from, price_to, order, and page filters as keyword catalog search.
Does Vinted pricing differ by country?
Yes. Vinted runs separate locale domains — vinted.fr, vinted.de, vinted.co.uk, vinted.it, and others — each with its own currency and listing pool for the same underlying catalog, so cross-market price research means querying each locale and normalizing currency yourself.
What breaks a DIY Vinted scraper?
Client-side rendering (catalog and item pages hydrate via JavaScript, so plain HTTP requests often return an empty shell), anti-bot IP blocking, per-country domain and currency differences, and CSS selectors that break whenever Vinted redesigns its grid or item pages.