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
3
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share

Analyse demand and sell-through on Vinted at scale: per-query market reports with sold-versus-active ratios, price distributions and demand signals, ready for resale research and pricing decisions. No API key required.
Why this scraper?
π― Built for vinted
A dedicated European scraper tuned for vinted β its categories, price formats and currency (EUR), not a generic tool pointed at it.
π€ Seller and condition
Seller details and item condition in structured fields, ready for filtering.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "nike air force 1" | Product, brand, or model to scan across markets (e.g. 'nike air force 1', 'ralph lauren jumper'). |
countries | array | ["fr", "de", "nl", "it", "es"] | Vinted markets to scan. Pick 2-5 for a focused arbitrage scan. All listings are normalised to one currency for comparison. |
maxResults | integer | 100 | Total listings to return across all markets (split evenly). Vinted caps each query at ~960 per market. |
baseCurrency | string | "EUR" | Currency all markets are converted to for price-gap comparison. Live ECB rates. |
sortBy | string | "relevance" | How listings are ordered within each market. |
priceMin | integer | (empty) | Minimum listing price in each market's local currency. Leave empty for no minimum. |
priceMax | integer | (empty) | Maximum listing price in each market's local currency. Leave empty for no maximum. |
condition | array | (empty) | Filter by item condition. Leave empty to include all conditions. |
brandNames | array | (empty) | Filter by brand β just type the names (e.g. 'Nike', 'Stone Island'). The actor looks up each brand's ID automatically. Leave empty for all brands. |
brandIds | array | (empty) | Advanced: filter by raw Vinted brand ID if you already know it. Most users should use Brand names above instead. |
sizeIds | array | (empty) | Advanced: filter by raw Vinted size ID for categories not covered by the dropdowns below. Find it in the URL after selecting a size filter. Leave empty for all sizes. |
clothingSizes | array | (empty) | Filter by clothing size (XSβXXXL). For shoes, use the shoe size filter below. Leave empty for all sizes. |
shoeSizes | array | (empty) | Filter by EU shoe size (38β47.5). For clothing, use the clothing size filter above. Leave empty for all sizes. |
kidsSizes | array | (empty) | Filter by kids clothing size (age / cm, e.g. '6 yr / 116 cm'). Covers newborn to 16 years. Leave empty for all sizes. |
colors | array | (empty) | Filter listings by colour. Leave empty for all colours. Note: Vinted does not return a colour value per listing, so this narrows the scan but does not add a colour output field. |
gender | string | "all" | Filter by department. Vinted sells far more than clothing β pick Home, Electronics, Video Games, Books & Media, Beauty, Jewellery, Sports, or Bags for non-fashion categories. Leave as 'All' to search everything. Note: if you pick a specific Category below, that takes precedence over this. |
category | string | "all" | Filter by product category. These are the verified cross-department categories. For any other category, use the advanced Category ID field below. If set, this overrides the Department filter. |
categoryId | integer | (empty) | Advanced: filter by a specific Vinted catalog ID not covered by the Category dropdown. Find it in the catalog URL (catalog[]=NUMBER). Overrides Department and Category if set. |
includeListings | boolean | true | Output every matching listing row. Disable to get only the cross-country arbitrage summary (cheaper). |
dedupeAcrossMarkets | boolean | true | Vinted shows the same listing in every market it ships to. With this on, each item appears once, with a 'markets' field listing every market it was found in. Turn off to get one row per market. |
fetchDetails | boolean | false | Fetch each listing's page for the seller's description, declared colour, and full category path β data not in the fast search API. This makes runs slower and is billed at a higher per-result rate. Leave off for fast, cheap catalog data. |
sellThroughTracking | boolean | false | Measure real demand. Run this on a schedule (e.g. daily): the actor snapshots live listings and flags items that disappear as 'likely sold', giving you a sell-through rate and median days-to-sell for your niche. Overrides the normal scan output. |
trackerName | string | (empty) | A stable name for this sell-through tracker (e.g. 'nike-af1-kids'). Reuse the same name across scheduled runs so history accumulates. Leave empty to auto-generate from the search query. |
missingRunsBeforeSold | integer | 2 | How many consecutive runs an item must be absent before it's marked likely sold. Use 2 to avoid false positives from search-ranking shuffle. |
emitActiveItems | boolean | true | In sell-through mode, also output items that are still listed (with days-listed and any price drop). Disable to output only newly-sold items and the summary (cheaper). |
minSellThroughAlertPct | integer | (empty) | In sell-through mode, only send a webhook alert when the sell-through rate is at least this percentage. Leave empty to always alert. Pairs with the Telegram/Discord/Slack fields below. |
includeArbitrageSummary | boolean | true | Add one summary row comparing median/min/max prices across markets and naming the buy-low / sell-high pair. |
telegramBotToken | string | (empty) | Optional. Send each run's arbitrage alert to Telegram. Create a bot with @BotFather and paste its token here. Also fill in the chat ID below. |
telegramChatId | string | (empty) | Optional. The chat or channel ID to send Telegram alerts to (e.g. your user ID, or -100... for a channel). Required if a bot token is set. |
discordWebhookUrl | string | (empty) | Optional. Send each run's arbitrage alert to a Discord channel. Paste an Incoming Webhook URL (Server Settings β Integrations β Webhooks). |
slackWebhookUrl | string | (empty) | Optional. Send each run's arbitrage alert to a Slack channel. Paste an Incoming Webhook URL (api.slack.com/messaging/webhooks). |
minSpreadPctAlert | integer | (empty) | Only send alerts when the cross-country median spread is at least this percentage. Leave empty to always alert. Useful for scheduled runs that should only ping you on real opportunities. |
alertTopListings | integer | 5 | How many of the cheapest listings to include in each alert message. |
Output schema
Every field below is present on every record. Fields the source does not publish for a given item are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
_type | string | type. |
id | string | Vinted listing ID. |
country | string | Market the listing was found in. |
url | string | Direct listing URL. |
title | string | Listing title. |
brand | string | null |
size | string | null |
condition | string | null |
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 |
favouriteCount | number | null |
isPromoted | boolean | Whether the listing is a promoted/bumped item. |
isBusinessSeller | boolean | null |
photoCount | number | Number of photos on the listing. |
photoUrl | string | null |
dominantColor | string | null |
photoUploadedAt | string | null |
source | string | Source. |
scrapedAt | string | Timestamp when this record was scraped. |
itemPriceBase | number | null |
buyerPriceBase | number | null |
baseCurrency | string | The comparison currency. |
markets | array | Every market this exact item was found in (cross-market duplicates are merged into one row). |
Example record
{"_type": "LISTING","id": "9222956838","country": "fr","url": "https://www.vinted.fr/items/9222956838-nike-air-max-muse-beige","title": "Nike Air Max Muse beige","brand": "Nike","size": "38.5","condition": "Très bon état","currency": "EUR","itemPrice": 30,"buyerPrice": 32.2,"serviceFee": 2.2,"favouriteCount": 11,"isPromoted": false,"isBusinessSeller": false,"photoCount": 6,"photoUrl": "https://images1.vinted.net/t/04_0178a_RicYp7npXNhP88DF81HxR1j5/f800/1782037084.jpeg?s=cc093d2951e723dd88aafcea690c2f782094b11c","dominantColor": "#7D7266","photoUploadedAt": "2026-06-21T10:18:04.000Z","source": "vinted-arbitrage-scanner","scrapedAt": "2026-06-27T12:30:04.894Z","itemPriceBase": 30,"buyerPriceBase": 32.2,"baseCurrency": "EUR","markets": ["fr"]}
Examples
Search for Nike hoodie:
{"searchQuery": "Nike hoodie","maxResults": 100}
Filter by category or condition:
{"searchQuery": "Nike hoodie","maxResults": 100,"condition": ["used"]}
Larger run with a hard cap:
{"searchQuery": "Nike hoodie","maxResults": 500}
Daily monitoring (run on a schedule):
{"searchQuery": "Nike hoodie","maxResults": 500}
Schedule this input to run once a day in the Apify Scheduler to track prices, stock and new items over time.
π° Pricing
$0.8 per 1,000 results β you only pay for successfully retrieved market reports. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.08 |
| 1,000 | ~$0.8 |
| 10,000 | ~$8 |
| 100,000 | ~$80 |
Flat-rate alternatives typically charge $29β$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.76 per 1,000 at the highest tier. Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2β4 minutes |
| 10,000 results | 20β35 minutes |
Known limitations
- Some fields (brand, condition, shipping) are only returned when the seller or source publishes them β expect
nullon a share of records. - Prices and stock change constantly; records reflect the moment of scraping.
- Very large result sets are bounded by the source's own paging limits.
- Items can sell or be withdrawn at any time, so a small share of URLs may expire shortly after scraping.
Technical details
- Source: vinted
- Coverage: everything the public search exposes, filterable via the input parameters above
- Retry: automatic retry on network errors with exponential backoff
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