Vinted Scraper — Listings, Demand Signals & Sold Tracking avatar

Vinted Scraper — Listings, Demand Signals & Sold Tracking

Pricing

from $1.20 / 1,000 result scrapeds

Go to Apify Store
Vinted Scraper — Listings, Demand Signals & Sold Tracking

Vinted Scraper — Listings, Demand Signals & Sold Tracking

Scrape Vinted across every EU market: price, brand, size, condition, favourites, listing age, seller country and all photos. Works on vinted.be, .nl, .de, .it and .es, not just .fr. Watch mode re-checks known listings so you can see which ones sold. No login, no proxy.

Pricing

from $1.20 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Vinted Scraper

Scrape Vinted listings across every European market, and track a fixed set of listings over time to see which ones actually sell.

Why use this actor

Vinted is the biggest second-hand marketplace in Europe, and it is the price reference for anyone buying or reselling used clothing. This actor reads it through Vinted's own search API, so you get the same records the site shows, with the fields that matter for pricing: asking price, the all-in price a buyer pays, condition, size, how long the listing has been up, and how many people have favourited it.

Two things here that most Vinted scrapers do not do.

It works on every market, not just France. Vinted puts a Cloudflare challenge in front of the HTML on vinted.be, .nl, .de, .it, .es and .pl. Scrapers that start by loading the homepage fail on all six and only work on .fr and .co.uk. This one does not load the homepage.

It can tell you what sold. Vinted deletes sold listings from the catalogue outright, so there is no sold-price history anywhere to query. mode: "watch" builds one forward: you hand it a set of listings, it re-checks them on a schedule, and it reports which are still live and which have gone.

How to scrape Vinted data

  1. Pick a mode. index for a fast catalogue read, full if you also need descriptions and colours, watch to track listings over time.
  2. Give it search terms, or paste a Vinted search URL you built in the browser.
  3. Pick a market. This sets the language and currency, not the inventory — see the note below.
  4. Run it. Export JSON, CSV or Excel, or pull the dataset over the API.

No login, no cookies to supply, no proxy. A free Apify account is enough to try it.

The three modes

indexfullwatch
What it readsVinted's search APIsearch API + one page per listingsearch API + one liveness probe per tracked listing
Speed89 listings in 6.5s~2.5s per listing~30 listings/minute (rate-limited, see below)
Fieldseverything in the table below except the five marked "full only"all of themlisting fields plus the lifecycle fields
Best forprice monitoring, catalogue snapshots, market sizingproduct records, colour/material filtering, reserved statusbuilding a sold-price series

index is the default and it is the one to reach for. full costs roughly 150x the bytes per listing (370 KB against ~4 KB) because Vinted's item-detail API endpoint was removed and the listing page is the only route left to descriptions.

Watch mode, and what it can honestly tell you

Vinted removes a listing the moment it sells. So a sold-price index cannot be backfilled, from this actor or any other. It has to accumulate.

Watch mode keeps its state in a named key-value store, so consecutive runs add up instead of each starting blind. Schedule it daily and each run:

  1. optionally runs your searches and adds anything new to the watchlist,
  2. probes every tracked listing to see whether it is still live,
  3. writes one record per tracked listing with status, daysLive, lastKnownPrice and every price change it has seen.

The probe asks Vinted about the listing directly (/items/{id} answers a redirect when the listing is live and a 404 when it is gone). It does not look for the listing in search results, so the usual "is it gone or did the ranking just shuffle?" problem does not arise. missesBeforeVanished exists to absorb network flakes, not ranking noise, and 2 is plenty.

The soldSignal field is graded honestly:

ValueMeans
noneLive, nothing happening
reservedLive, and the seller has marked it reserved — a sale is in progress
vanishedGone. This could be a sale or a delisting, and Vinted does not tell you which
reserved-then-vanishedReserved first, then gone. This reads as a completed sale at lastKnownPrice

reserved is the signal worth paying for, and it needs checkReserved: true, which fetches each live listing's page. That is the expensive option in this actor. Leave it off for a large watchlist and take vanished for what it is.

Input

FieldTypeDefaultDescription
modeStringindexindex, full or watch
searchQueriesArray["nike"]Search terms. maxItems is split evenly between them
searchQueryStringSingle-term convenience alternative
marketStringbeDomain to read. See the market note below
maxItemsInteger100Stop after this many records
startUrlsArrayVinted search URLs; their filters are reused verbatim
orderStringrelevancerelevance, newest_first, price_low_to_high, price_high_to_low
priceFrom / priceToIntegerPrice band. Also the way past the 960-result cap
conditionIdsArray6 = new with tags, 1 = new without tags, 2 = very good, 3 = good, 4 = satisfactory, 7 = not fully functional
brandIds / catalogIdsArrayVinted's numeric brand and category ids
fetchSellerCountryBooleantrueLook up each seller's country. Not in the search response, so it costs one API call per unique seller
includeSellerProfileBooleanfalseAdds seller city, rating and review count. Personal data — see below
watchItemIdsArrayWatch mode. Listing ids or item URLs to track
watchStoreNameStringvinted-watchlistWatch mode. Which key-value store holds the watchlist
seedWatchlistFromSearchBooleantrueWatch mode. Also run the searches each time and add what is new
checkReservedBooleanfalseWatch mode. Fetch each live listing's page to read reserved status
missesBeforeVanishedInteger2Watch mode. Consecutive 404s before a listing is called vanished
dropVanishedAfterRunsInteger3Watch mode. How long a vanished listing stays in the output
requestDelayMsInteger150Politeness delay. 0 for maximum speed
proxyConfigurationObjectoffLeave off. A direct connection is what works here

Output

FieldTypeExampleNote
listingIdString"9484408775"Stable, global across all Vinted domains
statusString"active"active or vanished. Not the same thing as condition
titleString"Lanvin curb sneaker white blue"
brandString"Lanvin"92–100% coverage; a few listings have no brand set
priceNumber110Seller's asking price
totalPriceNumber116.2Asking price plus buyer protection — what a buyer pays
serviceFeeNumber6.2Vinted's buyer-protection fee
currencyString"EUR"
sizeString"44"83–100%. Genuinely absent on unsized items
conditionString"Très bon état"In the market's language. See below
urlStringfull listing URL
datePostedString"2026-07-25T08:51:00.000Z"See the caveat below
listingAgeDaysNumber4.08High values mean the asking price is not clearing
favouritesInteger25The demand signal. A real count
viewsInteger0Always 0. See limitations
sellerId / sellerNameString"remmydrost"
sellerCountryString"NL"98–100% when fetchSellerCountry is on, otherwise null
sellerIsBusinessBooleanfalse
sellerCity / sellerRating / sellerReviewCountOnly when includeSellerProfile is on
isPromotedBooleantrueSeller paid to boost this listing
photosArray6 URLsAll photos, full size
photoCountInteger6
market / searchQuery / scrapedAtProvenance
descriptionStringfull only
colour / materialString"Blanc, Bleu"full only. material is only set on ~10% of listings, by the seller
catalogId / brandIdInteger1242 / 5257full only. Reusable as filters
isReservedBooleanfalsefull only, or watch mode with checkReserved
firstSeenAt / lastSeenAt / daysLive / checks / vanishedAt / lastKnownPrice / priceChanges / soldSignalwatch only

Example output

{
"listingId": "9484408775",
"status": "active",
"title": "Lanvin curb sneaker white blue",
"brand": "Lanvin",
"price": 110,
"currency": "EUR",
"totalPrice": 116.2,
"serviceFee": 6.2,
"size": "44",
"condition": "Très bon état",
"url": "https://www.vinted.be/items/9484408775-lanvin-curb-sneaker-white-blue",
"datePosted": "2026-07-25T08:51:00.000Z",
"listingAgeDays": 4.08,
"favourites": 25,
"views": 0,
"sellerId": "80639665",
"sellerName": "remmydrost",
"sellerCountry": "NL",
"sellerIsBusiness": false,
"isPromoted": false,
"photoCount": 6,
"photos": ["https://images1.vinted.net/tc/..."],
"market": "be",
"searchQuery": "lanvin",
"scrapedAt": "2026-07-29T10:39:12.000Z"
}

A watch-mode record for the same listing, on its fourth check:

{
"listingId": "9484408775",
"status": "vanished",
"soldSignal": "reserved-then-vanished",
"brand": "Lanvin",
"lastKnownPrice": 110,
"currency": "EUR",
"firstSeenAt": "2026-07-25T08:00:00.000Z",
"lastSeenAt": "2026-07-28T08:00:00.000Z",
"vanishedAt": "2026-07-29T08:00:00.000Z",
"daysTracked": 4.0,
"daysLive": 3.0,
"checks": 4,
"consecutiveMisses": 2,
"priceChanges": [{ "at": "2026-07-27T08:00:00.000Z", "price": 110 }],
"wasReservedBeforeVanishing": true
}

Markets: read this before picking one

fr, be, nl, de, it and es all serve the same euro catalogue. Run the same query against two of them and 17 to 18 of the first 20 results are the same listings — the differences are promoted slots, not different stock. What the market actually changes:

  • the language of condition (Très bon état / Goed / Gut)
  • the currency
  • the host in url

uk (GBP) and pl (PLN) are genuinely separate catalogues with no overlap.

So "scrape Belgium" is not a thing on Vinted. If you need seller country, read the sellerCountry field and filter on it — Vinted's API has no country filter.

Speed and cost

Measured on Apify, 1 GB memory, no proxy, 2026-07-29:

RunResultTimeCompute unitsPlatform cost
index, 89 listings, no seller lookup896.5s0.0018$0.0008
index, 60 listings, with seller country6066s0.018$0.0033
full, 10 listings1025s0.007$0.0012
watch, seed 25 listings2526s0.007$0.0014
watch, re-check 35 listings3585s0.024$0.0041

The seller-country lookup is the main cost driver in index mode: it turns one request per 96 listings into one request per unique seller. Turn fetchSellerCountry off and a 100-listing scrape finishes in under 7 seconds.

Limitations

Stated plainly, because you will hit these.

  • Any single search returns at most 960 results. Vinted caps page size at 96 and page number at 10. This is Vinted's limit, not the actor's. To go deeper, split the query into price bands with priceFrom / priceTo, or filter by brand or category.
  • pagination.total_entries is always 960, on every query, including one that matches three items. It is a display constant in Vinted's API, not a count. This actor ignores it and so should you.
  • views is always 0. Vinted zeroes the view count in search results (measured 95 out of 95 listings, maximum 0). The field is kept because it is in their payload and may come back, but today favourites is the only usable demand signal.
  • datePosted is a proxy. Vinted exposes no creation timestamp anywhere. This is the upload time of the listing's first photo, which matched Vinted's own "added N days ago" label on 5 of 5 spot checks. A relisting that reuses old photos will read older than it is.
  • condition, colour and material come back in the market's language. There is no locale override — the domain is the locale.
  • material is set on about 10% of listings. Sellers rarely fill it in. That is Vinted's data, not a scraping gap.
  • The listing-page route is rate-limited to roughly 30 requests per burst, then answers HTTP 429 for about a minute. That is the ceiling on full mode and on watch mode throughput. The actor paces itself adaptively and retries, so a large watchlist works, it just takes minutes rather than seconds. A rate limit is never counted as "listing gone".
  • No sold-price history, and none is possible. Vinted deletes sold listings. Watch mode builds a sold series forward from the day you start it and cannot look back. Nothing can.
  • vanished is not the same as sold. A listing can disappear because it sold, because the seller pulled it, or because Vinted removed it. Only reserved-then-vanished is strong evidence of a sale.

No hosted search layer here

Some sites power their search box with a third-party service (Algolia, Typesense, Constructor) whose index can be queried directly and cheaply. Vinted does not. /api/v2/catalog/items is Vinted's own search service, and it is already the fast path — there is no cheaper index sitting behind the site. So unlike our Yoox scraper, there is no index-versus-crawl trade-off to choose here; index mode already reads the same service the website reads.

Personal data and GDPR

Vinted listings carry personal data: seller usernames, profile photos, city, country, and whatever the seller typed into the description. That is personal data under GDPR whether or not it was posted publicly.

This actor is built to collect less of it by default:

  • sellerName, sellerId and sellerCountry are returned because they are part of the listing and most use cases (price comparison, marketplace analysis) need to distinguish sellers and markets.
  • sellerCity, sellerRating and sellerReviewCount are off by default behind includeSellerProfile. They go beyond what the listing card shows.
  • description is only fetched in full mode, because it is free text that can contain anything.

If you are processing this data in the EU, you need a lawful basis for it, you should keep only the fields your use case actually needs, and you should not retain seller identifiers longer than you need them. Turning includeSellerProfile off and fetchSellerCountry off, where your use case allows, is the cheapest way to stay on the right side of that.

  • Yoox Scraper — luxury outlet prices with the supplier-stated RRP beside them. The new-price reference to put next to a Vinted asking price.
  • Vinted Scraper (v1) — the earlier build. Still works on vinted.fr; this one replaces it everywhere else.

Need this data on a schedule, or a custom version?

Watch mode is designed to be scheduled. Set it to run daily against a watchStoreName of your choosing and the watchlist accumulates on its own.

If you need a different shape of output, a different market set, or a version that pushes straight into your warehouse, open an issue on the actor page.