Vinted Demand & Sell-Through Scraper
Pricing
from $0.78 / 1,000 results
Vinted Demand & Sell-Through Scraper
Vinted demand intelligence: sell-through rate, realised sale prices, days-to-sell, and cross-market sourcing. No proxy, no PII.
Pricing
from $0.78 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Most Vinted scrapers tell you what's listed. This one tells you what actually sells — at what price, and how fast.
Run it on a schedule and it tracks your niche over time: which items disappear (sold), what they really went for, how many days they took, and which price bands move quickest. On top of that it does cross-market sourcing — find the cheapest listings for a product across up to 26 markets in one run, every price normalised to one currency.
Built for resellers who want to validate demand before they buy, not just pull a list of listings.

Why this over other Vinted scrapers
Other Vinted scrapers extract listings. A few add a cross-country "arbitrage" comparison. This actor does what actually drives sourcing decisions, and is honest about what works:
- Real sell-through, not just listings. Vinted has no "sold" flag — sold items simply vanish. By tracking your niche across scheduled runs, this actor reports a true sell-through rate, median days-to-sell, and per-item sold detection. Other scrapers can't tell you whether anything actually sells.
- Realised sale prices. When an item sells, you get its last price before it disappeared — the median, min, max, and average of what items actually went for. Listing prices tell you what sellers hope for; this tells you what the market pays.
- Velocity by price band. See which price points move fastest (e.g. under-€20 in 3 days vs €50-100 in 12), so you source what turns over.
- Price-drop detection. Flags still-listed items whose seller cut the price since the last run — a signal of stock that isn't moving. Folded into the same run, not a separate paid mode.
- Honest cross-market sourcing. Two things people confuse: a single listing (one seller's specific item) has the same price in every Vinted market it ships to — so there's no "buy the same listing cheaper abroad" arbitrage, contrary to what "arbitrage" scrapers imply (we verified this). But a product — say a black Nike Air Force 1 in size 42 — is sold by many different sellers at many different prices. The real edge is scanning all those sellers across every market in one run to find the genuinely underpriced ones, plus benchmarking what the product typically goes for. This actor surfaces that without overclaiming a price gap that isn't there.
- Real buyer-paid price. Every listing carries
buyerPrice— the total including Vinted's Buyer Protection fee, the number that actually decides a flip. Most scrapers omit it. - No proxy required, no PII. Direct connection, listing data only — no seller names, profiles, or personal data.
What it does
- Sell-through tracking. Scheduled snapshot comparison surfaces what sold, what it sold for, and how fast — the core demand signal. (See the dedicated section below.)
- Cross-market sourcing. Search one query across multiple Vinted markets at once, every price converted to your comparison currency via live ECB rates, deduplicated so the same cross-listed item appears once with the markets it ships to.
- Every Vinted category, not just clothing. Search fashion (women/men/kids) or Home, Electronics & Entertainment, Video Games, Books & Media, Beauty & Hair, Jewellery, Sports & Footwear, Phone Accessories, and Bags — the whole marketplace, one actor.
- Rich filters. Department, category, colour, clothing/shoe/kids sizes, condition, brand, and price range — all server-side.
- Demand signals. Favourite counts on every listing.
- No item cap. Up to ~960 listings per market per query (Vinted's ceiling), across as many markets as you select.
- Alerts. Push sell-through summaries or sourcing results to Telegram, Discord, or Slack.
Pricing
$0.80 per 1,000 results ($0.0008 per result), tiered down to $0.76/1,000 at the DIAMOND plan. A small $0.001 per run start fee also applies (charged per GB of memory at run start, minimum one), which keeps tiny test runs essentially free. No subscription — you pay per use.
With Fetch full item details enabled, results are billed at $1.29 per 1,000 instead — this fetches each listing's page for the seller's description, declared colour, and full category path (data the fast search API doesn't expose).
Input
| Field | Type | Description |
|---|---|---|
searchQuery | string | Product, brand, or model to scan (e.g. nike air force 1). |
countries | array | Markets to compare. Default: FR, DE, NL, IT, ES. 26 markets available. |
maxResults | integer | Total listings across all markets (split evenly). Default 100. |
baseCurrency | string | Currency all markets convert to for comparison. Default EUR. |
sortBy | string | relevance, price_low_to_high, price_high_to_low, newest_first. |
priceMin / priceMax | integer | Price bounds in each market's local currency. |
condition | array | Filter by condition (new with tags, very good, etc.). |
brandNames | array | Filter by brand — type names like "Nike", "Stone Island"; IDs are looked up automatically. |
brandIds | array | Advanced: raw Vinted brand ID if you already know it. |
clothingSizes | array | Filter by clothing size (XS–XXXL). |
shoeSizes | array | Filter by EU shoe size (38–47.5). |
sizeIds | array | Advanced: raw Vinted size ID for other categories. |
colors | array | Filter by colour (black, white, red, blue, etc.). Narrows the scan; not added as an output field — Vinted doesn't return a colour per listing. |
gender | string | Department: All, Women, Men, Kids. |
category | string | Verified category: Shoes, Coats & Jackets, Dresses, Bags, Men's Jeans. Overrides gender. |
categoryId | integer | Advanced: raw Vinted catalog ID for any other category. |
includeListings | boolean | Output every listing row. Default true. |
fetchDetails | boolean | Fetch each listing's description, declared colour, and full category path (slower; billed at the premium $1.29/1k rate). Default off. |
includeArbitrageSummary | boolean | Output the cross-country summary row. Default true. |
Output
Listing rows (always present when includeListings is on)
| Field | Type | Description |
|---|---|---|
id | string | Vinted listing ID. |
country | string | Market the listing was found in. |
description | string | (fetchDetails only) Seller's free-text description — measurements, flaws, authenticity notes. |
declaredColor | string | (fetchDetails only) The colour the seller declared (not in the search API). |
categoryPath | string | (fetchDetails only) Full category path, e.g. "Men > Windbreaker Jackets". |
markets | array | Every market this exact item was found in (cross-market duplicates are merged into one row). |
url | string | Direct listing URL. |
title | string | Listing title. |
brand | string | null | Brand name. |
size | string | null | Size label. |
condition | string | null | Item condition. |
currency | string | Local currency of the listing. |
itemPrice | number | Seller's asking price (local currency). |
buyerPrice | number | Total the buyer pays incl. Buyer Protection (local currency). |
serviceFee | number | null | Buyer Protection fee (local currency). |
itemPriceBase | number | null | Asking price converted to your comparison currency. |
buyerPriceBase | number | null | Buyer-paid price converted to your comparison currency. |
baseCurrency | string | The comparison currency. |
favouriteCount | number | null | Number of favourites (demand signal). |
isPromoted | boolean | Whether the listing is a promoted/bumped item. |
isBusinessSeller | boolean | null | Whether the seller is a registered business (vs private individual). No seller identity is collected. |
photoCount | number | Number of photos on the listing. |
photoUrl | string | null | Primary product photo. |
dominantColor | string | null | Dominant colour of the primary photo (hex). |
photoUploadedAt | string | null | Approximate listing-creation time (primary image upload, ISO). |
Arbitrage summary row (when includeArbitrageSummary is on)
| Field | Description |
|---|---|
buyLowMarket | Market with the lowest median price. |
sellHighMarket | Market with the highest median price. |
medianSpread | Median price gap between them (comparison currency). |
medianSpreadPct | The same gap as a percentage. |
perMarket | Per-market min / median / average / max and sample size. |
Example output
{"id": "9214402685","country": "uk","url": "https://www.vinted.co.uk/items/9214402685-nike-air-force-1","title": "Nike Air Force 1 white","brand": "Nike","size": "UK 7","condition": "Very good","currency": "GBP","itemPrice": 22,"buyerPrice": 24.35,"serviceFee": 2.35,"itemPriceBase": 25.39,"buyerPriceBase": 28.1,"baseCurrency": "EUR","favouriteCount": 34,"isBusinessSeller": false,"photoCount": 5,"isPromoted": false,"photoUrl": "https://images1.vinted.net/t/.../f800/....jpeg","dominantColor": "#B58D86","photoUploadedAt": "2026-06-19T14:22:05.000Z"}
{"_type": "ARBITRAGE_SUMMARY","query": "nike air force 1","baseCurrency": "EUR","buyLowMarket": "uk","sellHighMarket": "fr","medianSpread": 29.04,"medianSpreadPct": 111.9,"perMarket": [{ "country": "uk", "currency": "GBP", "sampleSize": 20, "minPrice": 1.73, "medianPrice": 25.96, "avgPrice": 28.4, "maxPrice": 103.86 },{ "country": "fr", "currency": "EUR", "sampleSize": 20, "minPrice": 8, "medianPrice": 55, "avgPrice": 52.1, "maxPrice": 90 }]}
Examples
1. Scan a sneaker across five markets
{"searchQuery": "nike air force 1","countries": ["fr", "de", "uk", "it", "es"],"maxResults": 250,"baseCurrency": "EUR"}
2. Find the cheapest market for a brand, new-with-tags only
{"searchQuery": "ralph lauren shirt","countries": ["uk", "pl", "ro", "lt"],"condition": ["new_with_tags"],"sortBy": "price_low_to_high","maxResults": 200}
3. Brand-filtered scan with a price ceiling
{"searchQuery": "jacket","brandIds": ["53"],"priceMax": 40,"countries": ["fr", "de", "be", "nl"],"baseCurrency": "EUR","maxResults": 300}
4. Summary only — a daily market map with no listing rows
{"searchQuery": "carhartt","countries": ["fr", "de", "uk", "it", "es", "pl"],"includeListings": false,"includeArbitrageSummary": true}
Notes
- Vinted caps any single search at roughly 960 results per market. The scanner paginates up to that ceiling per market and stops cleanly.
- Prices are normalised with live European Central Bank reference rates, refreshed each run. Treat converted figures as indicative — actual FX at checkout varies.
- This actor reads publicly visible listing data only. It does not collect seller names, profile pages, or any personal data, and it does not log in, transact, or interact with the marketplace.
Alerts (Telegram, Discord, Slack)
Schedule this actor and have arbitrage opportunities pushed to you automatically — no need to log in and check the dataset. Configure any combination of the three channels; alerts are optional and never block a run.
Each alert contains the cross-country arbitrage summary (buy-low / sell-high markets and the spread) plus the cheapest listings found.
| Field | What to enter |
|---|---|
telegramBotToken + telegramChatId | Create a bot with @BotFather, paste its token and the target chat/channel ID. |
discordWebhookUrl | A Discord Incoming Webhook URL (Server Settings → Integrations → Webhooks). |
slackWebhookUrl | A Slack Incoming Webhook URL. |
minSpreadPctAlert | Only alert when the median spread is at least this %. Leave empty to always alert. |
alertTopListings | How many of the cheapest listings to include per alert (default 5). |
Pair this with Apify's scheduler to get, for example, a daily Telegram ping listing the best cross-border flips for your niche — but only when the spread is worth acting on.
Sell-through tracking — measure real demand
The most valuable signal for a reseller isn't what's listed — it's what actually sells. Vinted has no "sold" marker (sold items just vanish), so this mode works by comparison: run it on a schedule, and the actor snapshots the live listings each time. Items that disappear are flagged likely_sold, giving you a real sell-through rate and median days-to-sell for your niche.
Turn on sellThroughTracking, give it a stable trackerName, and schedule it (daily works well). The first run records a baseline; every run after that reports what sold.
| Field | What it does |
|---|---|
sellThroughTracking | Switches the actor into tracking mode. |
trackerName | Stable name so history accumulates across scheduled runs. Reuse the same value. |
missingRunsBeforeSold | Consecutive runs an item must be absent before it counts as sold (2 avoids false positives). |
emitActiveItems | Also output still-listed items, with days-listed. |
Each run outputs a SELL_THROUGH_SUMMARY plus per-item rows. The summary goes beyond a simple sold count:
sellThroughRatePct,likelySold,stillActive,newItemsrealisedPrice— median/min/max/avg of what sold items actually went for (their last price before disappearing), not listing pricesmedianDaysToSellandvelocityByPriceBand— how fast items sell, segmented by price band (e.g. under-€20 vs €50-100)soldByCondition— which conditions movepriceDrops— still-listed items whose seller cut the price since last run (a signal of stock that isn't moving)
Optionally send a sell-through alert to Telegram/Discord/Slack each run, gated by minSellThroughAlertPct so you're only pinged when a niche is genuinely moving.
Use it to validate demand before you buy: a niche with a high sell-through rate, low days-to-sell, and a healthy realised price is one worth sourcing.
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl