Vinted Underpriced Deals — Cheap and Wanted, in One Call avatar

Vinted Underpriced Deals — Cheap and Wanted, in One Call

Pricing

from $20.00 / 1,000 search scanned for deals

Go to Apify Store
Vinted Underpriced Deals — Cheap and Wanted, in One Call

Vinted Underpriced Deals — Cheap and Wanted, in One Call

Which Vinted listings are cheap right now? Builds the asking-price distribution for your search on one country's site, scores every listing against it, and returns those below your percentile, ranked by favourite count. Promoted listings are kept out of the basis. A mixed search is refused.

Pricing

from $20.00 / 1,000 search scanned for deals

Rating

0.0

(0)

Developer

h ichi

h ichi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Every Vinted scraper on the Store will hand you a page of listings. None of them will tell you whether the listing in front of you is cheap, and none of them will tell you whether anyone else wants it. This one answers both in a single call: it builds the asking-price distribution of your search on one country's site, returns the listings below your percentile, and ranks them by demand.

Read this before you read the numbers

Vinted has no sold data. Its catalog serves live, unsold listings only — there is no sold book to scrape, buy or infer. So the basis here is the asking-price distribution of the search itself, exactly as our AutoScout24 deal finder does for cars.

That means every number in the output answers "cheap relative to what else is being asked right now" and not "cheap relative to what things sell for". discountBasis says so on the summary and on every single deal record. If you need realized sale prices, this is the wrong marketplace, not the wrong Actor.

How a deal is picked

  1. Page the catalog for your search term with order=relevance, pushing priceMin / priceMax to Vinted so the basis and the candidates are the same sample.
  2. Drop the promoted placements, the duplicates and the priceless rows (see below) — what is left is the basis.
  3. dealCutoffPrice = the price at your dealPercentile of that basis. 20 means "in the cheapest fifth of what is on offer".
  4. Everything at or below the cutoff is a deal — then ranked by favouriteCount, not by how cheap it is.

Cheap alone is worthless. The cheapest listing in a fashion search is usually the least wanted one. Measured on nike air max / vinted.fr: the five cheapest "deals" in an unbounded search were a sports bra, a sweatshirt, a pair of shorts and two pairs of shoes; the five most favourited deals were all shoes. Demand is what separates a bargain from a thing nobody wants at any price.

The ranking is auditable, not asserted: demand.favouriteCountBasis and demand.favouriteCountDeals ship with every summary, and every deal carries its own favouriteCount, favouritePercentile and demandRank.

view_count is returned by Vinted's catalog endpoint and is always 0 — measured over ~1,800 items across seven searches and two country sites. It is therefore not part of the ranking, and demand.viewCountAvailable is false rather than the Actor quietly ranking on a field of zeroes.

Two prices, and which one the percentile is on

Vinted quotes price (what the seller asks) and total_item_price (what the buyer pays, i.e. asking + Buyer Protection — measured affine, about 0.70 + 5%). The percentile, the cutoff and the spread guard are all computed on the asking price, which is what the search page shows and what "underpriced" means. Both are emitted on every deal, together with buyerProtectionFee, so you can see the difference before you commit.

Two guards, because a basis can lie in two ways

Too thin. minComps (default 30) refuses a search whose percentile would rest on a handful of prices.

Too many kinds of thing. maxCompSpread checks the p90 / p10 ratio of the sampled asking prices and refuses a search that is mixing product tiers rather than describing one market. p90/p10 rather than p75/p25 because a fashion keyword is a wide market by nature and the mixing shows up in the tail. Measured on vinted.fr, 2026-08-10:

searchp90 / p10what it is
levis 5013.3xone product
nike air max, priceMin: 302.5xone product, tier-bounded
nike air max, unbounded5.3xshoes plus tracksuits, leggings and bags
zara robe5.7xmany dress tiers
chanel15.0xa keychain and a handbag in one median
leica m6204xa lens cap and a camera in one median

The fix is named in the refusal itself:

{ "keywords": ["nike air max"], "domain": "fr", "priceMin": 30 }

The band is pushed to Vinted, so it bounds the basis and the candidates together.

In both cases the run returns basisUsable: false with the reason, the ratio and the input that fixes it — and is not charged.

What the guards cannot fix is printed, not hidden

Every summary carries a limitations array. It will tell you, in the run's own numbers:

  • totalFound saturates at 960. Vinted stops counting and paging at 10 pages of 96 (page 11 is an HTTP 400). nike air max reports 960 and so does chanel, while leica m6 reports 218. 960 is a ceiling, not a counttotalFoundCapped: true means the real supply is unknown and larger, and your sample is the first pages by relevance rather than a random draw.
  • Promoted listings are excluded, and how many. Measured over all 880 distinct nike air max listings on vinted.fr: promoted median EUR 40 (n=281) against organic median EUR 20 (n=599) — and 66% of the first three relevance pages were promoted, against 32% over all ten. Sampling paid placements into the basis lifts the median and manufactures discounts out of nothing, so they are dropped from both sides and counted in excluded.promoted. The sampler pages deeper to make the shortfall up.
  • Duplicates, malformed rows and priceless rows, each counted separately in excluded. A filter whose count you cannot see makes the remainder look like the whole.
  • A pushed price band truncates the basis, so listings sitting on the floor of the band read as the 0th percentile.
  • A keyword is not a product. sampleMix shows the brands and conditions the percentile was actually built on.

Output

One deal_summary per search term — the basis (price with p10/p25/median/p75/p90, plus totalItemPrice), the guards and their verdict, the sample and everything excluded from it, the cutoff, the deal count, the demand statistics behind the ranking, bestDeal (most wanted) and cheapestDeal (lowest price — deliberately a different field). Optionally one deal record per listing under the cutoff, ranked by demand.

Country sites: vinted.com (USD), .fr .de .es .it .nl (EUR), .co.uk (GBP), .pl (PLN). The domain decides both the market and the currency, so a basis is never built across countries. USD figures are added alongside the native currency.

Pricing

From $0.02 per search term, $0.002 per individual deal. A search with an unusable basis is never charged.

Read-only public catalog data over HTTP/JSON — no login, no browser, throttled to one page per 1.5 s. Seller identities are never emitted. Nothing is stored between runs.