Vinted Scraper | From $0.75/1k ๐
Pricing
from $0.75 / 1,000 products
Vinted Scraper | From $0.75/1k ๐
Monitor and extract product listings, prices, photos & seller data from Vinted search results and catalogs. Fast, reliable API for market research, price monitoring & inventory tracking. AI agent friendly.
Pricing
from $0.75 / 1,000 products
Rating
4.8
(5)
Developer
Epic Scrapers
Maintained by CommunityActor stats
8
Bookmarked
845
Total users
119
Monthly active users
0.69 hours
Issues response
10 days ago
Last modified
Categories
Share
Vinted Scraper: search listings in 26 countries, compare prices and get alerts for new listings and price drops
Vinted Scraper turns any Vinted keyword or filtered catalog search into a spreadsheet of active listings: title, asking price, brand, size, condition, photos, favourites, views and seller. Search one country or the same keyword in several countries at once, and see where an item is cheapest. Schedule it, and each run saves only the listings that are new or cheaper since the last one.
- 26 Vinted countries. Search vinted.it, vinted.fr, vinted.de, vinted.pl, vinted.co.uk, vinted.com and 20 more, each through a local connection, so you see what shoppers in that country see.
- Cross-country price comparison. Run one keyword in several countries and get a summary of median prices converted to EUR, with the cheapest and most expensive country.
- New listings and price drops. The actor remembers listings between runs. Set Save only and you get just the new listings, the price drops, or both: a deal alert without writing any code.
- Every Vinted filter. Filter on Vinted by brand, size, condition, category or sort order, then paste the URL. The actor keeps all of its filters.
- Pay per listing, no subscription. No Vinted account, cookies or proxy setup. Export to JSON, CSV, Excel or Google Sheets.
Scope: This actor collects active listings from search and catalog pages and from seller (member) pages. It does not report which listings sold, and it does not read single item pages. For real sold prices of comparable items on another marketplace, use eBay Sold Listings API.
What can you do with Vinted Scraper?
| Goal | How |
|---|---|
| Get alerts for new deals | Schedule a search hourly with Save only set to new listings and price drops, and connect a webhook. |
| Find the cheapest country | Add countries to Also search in and read the COUNTRY_PRICE_SUMMARY record. |
| Price an item before reselling | Search the brand and model, filter by condition with a Vinted URL, and compare asking prices. |
| Source stock for a resale shop | Run your brands across several countries, sorted by price or newest, and compare asking prices. |
| Watch a brand or category | Paste a filtered catalog URL sorted by newest, and schedule it. |
| Build a market dataset | Set Products per search to 0 to collect every listing of a search, past Vinted's 960-result limit. |
| Check resale margins | Compare total_item_price on Vinted with sold prices on eBay (see Related Actors). |
How it compares
| What you need | Vinted Scraper | Page-by-page Vinted scrapers | Manual browsing |
|---|---|---|---|
| Countries | 26 Vinted sites, each through a local connection | Often one site or one proxy | One site at a time |
| Price comparison across sites | Built in: median price per country in EUR | Do it yourself | Hours of work |
| New listings and price drops | Built in, remembered between runs | Diff the exports yourself | Re-check by hand |
| Your Vinted filters | Paste the filtered URL; all filters are kept | Varies | Yes |
| Buyer fee and total price | service_fee and total_item_price on every row | Varies | Shown at checkout |
| Price | Pay per listing | Pay per listing or per month | Your time |
Quick start
- Click Try for free and sign in to Apify.
- Add a keyword to Keywords, for example
nike air max, and pick a Main country. Or paste a Vinted search URL into Vinted URLs. - For a first run, keep Products per search at
20. - Click Start. When the run finishes, open the Output tab and export the data.
{"keywords": ["nike air max"],"country": "it","maxProducts": 20}
What data can you extract?
Every row is one active listing, as returned by Vinted's catalog:
| Group | Fields |
|---|---|
| Listing | id, title, url, brand_title, size_title, status (condition in the site's language, such as Very good), status_id |
| Price | price (amount, currency_code), service_fee, total_item_price |
| Interest | favourite_count, view_count |
| Media | photo, photos (image URLs; files are not downloaded) |
| Seller | user (ID, login, business flag; profile URL and photo when Vinted returns them) |
| Search | vinted_country (the country the listing was found in) |
With price tracking on, each row also has:
| Field | Meaning |
|---|---|
is_new_listing | First time this search has seen the listing. |
first_seen_at | When the listing was first seen by this search. |
previous_price | The price in the previous run. |
price_change | Difference from the previous price, in the listing's currency. |
price_change_percent | The same difference as a percentage. |
price_dropped | true when the price is lower than in the previous run. |
status is the condition label in the language of the Vinted site, so the same condition reads Very good on vinted.co.uk, Sehr gut on vinted.de and Ottime on vinted.it. To filter or group by condition across countries, use status_id. It's the same ID that Vinted search URLs use in status_ids[]:
status_id | Condition |
|---|---|
6 | New with tags |
1 | New without tags |
2 | Very good |
3 | Good |
4 | Satisfactory |
status_id is null when Vinted doesn't return a condition.
Example output
A real row from a ceramica search on vinted.it with price tracking on (October 1, 2026). The photo object, with its thumbnail list, and a few internal fields are left out:
{"id": 10209679411,"title": "Bottiglietta Decorativa in Ceramica Bianca con Tappo โ Stile Shabby Chic / Vintage","url": "https://www.vinted.it/items/10209679411-bottiglietta-decorativa-in-ceramica-bianca-con-tappo-stile-shabby-chic-vintage","price": { "amount": "7.00", "currency_code": "EUR" },"service_fee": { "amount": "1.05", "currency_code": "EUR" },"total_item_price": { "amount": "8.05", "currency_code": "EUR" },"brand_title": "Bottiglietta Decorativa in Ceramica Bianca con Tappo โ Stile Shabby Chic / Vintage","size_title": null,"status": "Ottime","status_id": 2,"user": { "id": 75471980, "login": "paolocal1988", "business": false },"favourite_count": 0,"view_count": 0,"promoted": false,"vinted_country": "it","is_new_listing": false,"first_seen_at": "2026-10-01T23:42:27.140Z","previous_price": 7,"price_change": 0,"price_change_percent": 0,"price_dropped": false}
Here brand_title holds the title because the seller left the brand empty. status is in the language of the Vinted site (Ottime is Italian for very good); status_id is the same on every site.
Get deal alerts with scheduled runs
Most of the value comes from running the same search again. Apify can run the actor for you on a schedule and send the results wherever you need them.
1. Save your input as a task
Set your keywords or URLs, set Save only to New listings and price drops, then click Save as a new task. A task is a saved input you can run again with one click or on a schedule.
{"keywords": ["carhartt jacket"],"country": "de","maxProducts": 50,"saveOnly": "newOrPriceDrops"}
2. Schedule the task
In Apify Console, go to Schedules, click Create new, choose how often to run, and add your task. See Schedules and How to create a schedule.
Watch how to schedule an Actor:
Or schedule a saved task:
Common schedules:
| Use case | Frequency | Cron expression |
|---|---|---|
| Deal alerts for popular items | Every hour | 0 * * * * |
| New listings from a brand | Every 6 hours | 0 */6 * * * |
| Price tracking for a watchlist | Daily | 0 8 * * * |
| Cross-country price comparison | Weekly (Monday) | 0 8 * * 1 |
3. Get notified or send results to a spreadsheet
In the task's Integrations tab, connect email, Slack, a webhook, Make, Zapier or n8n to get each run's new listings and price drops. Connect Google to save every run to Google Sheets or Google Drive:
How tracking works
- The first run for a search saves all current listings as a baseline. Nothing is marked new or dropped yet.
- Later runs compare each listing with the previous run of the same search and save only what Save only asks for.
- History is kept per search URL in a key-value store named
vinted-price-historyin your Apify account. - Only listings within Products per search are compared. Raise the limit to watch more listings.
- Open the Price tracking view in the Output tab to see previous prices and changes side by side.
Compare prices across countries
{"keywords": ["nike air max 90"],"country": "it","compareCountries": ["pl", "fr"],"maxPrice": 80,"maxProducts": 20}
This runs the keyword on vinted.it, vinted.pl and vinted.fr. minPrice and maxPrice are in the main country's currency (EUR here) and are converted for other currencies (PLN for Poland) with European Central Bank rates. Every listing has vinted_country.
The run also saves a COUNTRY_PRICE_SUMMARY record in the key-value store, with the count, minimum, median, average and maximum price per country, in local currency and EUR:
[{"search": "nike air max 90","countries": [{ "country": "pl", "currency": "PLN", "count": 10, "median": 119.5, "median_eur": 27.33 },{ "country": "it", "currency": "EUR", "count": 10, "median": 38.5, "median_eur": 38.5 },{ "country": "fr", "currency": "EUR", "count": 10, "median": 40, "median_eur": 40 }],"cheapest_country": "pl","most_expensive_country": "fr","median_spread_eur": 12.67,"median_spread_percent": 46.36}]
The summary compares asking prices without buyer fees or shipping, so a difference between countries isn't a guaranteed profit.
Input reference
Supply at least one URL or one keyword.
| Field | Type | Default | Effect |
|---|---|---|---|
startUrls | Array of objects | Empty | Vinted search or catalog URLs, such as [{"url": "https://www.vinted.fr/catalog?search_text=levis"}]. Each URL is one search and keeps its own filters. |
keywords | Array of strings | Empty | Search terms. Each keyword is a separate search. |
country | String | "it" | Main country for keyword searches. Price filters use its currency. Doesn't change URLs. |
compareCountries | Array of strings | Empty | More countries to run every keyword in. Adds the COUNTRY_PRICE_SUMMARY record. |
minPrice/maxPrice | Number | Empty | Price range for keyword searches, in the main country's currency. |
maxProducts | Integer | 20 | Maximum listings per URL, keyword and country. 0 means no limit. Above 960 (Vinted's limit per search), the search is split automatically. |
trackPriceChanges | Boolean | false | Compare listings with earlier runs of the same search and add the price-change fields. |
saveOnly | String | "all" | "all", "new", "priceDrops" or "newOrPriceDrops". Anything other than "all" turns on price tracking. |
For brand, size, condition, category and sort filters, set them on Vinted and copy the URL. Category paths such as /catalog/5491-skorts_women work too. A seller URL such as https://www.vinted.fr/member/12345678-name returns all of that seller's active listings, newest first (up to Products per search). Single item URLs (/items/...) aren't supported: the run skips them with a warning.
Country codes: at Austria, be Belgium, hr Croatia, cz Czechia, dk Denmark, ee Estonia, fi Finland, fr France, de Germany, gr Greece, hu Hungary, ie Ireland, it Italy, lv Latvia, lt Lithuania, lu Luxembourg, nl Netherlands, pl Poland, pt Portugal, ro Romania, sk Slovakia, si Slovenia, es Spain, se Sweden, gb United Kingdom (vinted.co.uk), us United States (vinted.com).
Ready-to-run examples
Newest listings from a filtered search
{"startUrls": [{ "url": "https://www.vinted.fr/catalog?search_text=vintage%20jacket&price_to=40&order=newest_first" }],"maxProducts": 50}
Set filters on Vinted, sort by newest, and copy the URL. Schedule it to see new stock as it's listed.
Find where a brand is cheapest
{"keywords": ["arc'teryx jacket"],"country": "de","compareCountries": ["fr", "it", "pl", "es", "nl"],"maxProducts": 100}
Open COUNTRY_PRICE_SUMMARY in the key-value store for the median price per country in EUR.
Several searches in one run
{"startUrls": [{ "url": "https://www.vinted.fr/catalog?search_text=levis&price_to=35" }],"keywords": ["nike", "adidas"],"country": "it","minPrice": 10,"maxPrice": 50,"maxProducts": 20}
This returns up to 60 listings: 20 from the French URL and 20 for each Italian keyword. Country and price options apply only to keywords, never to URLs.
Analyze the results with ChatGPT or Claude
Export the dataset as CSV and attach it to a chat with ChatGPT, Claude or another AI assistant. Some prompts to start with:
Price an item. "This is Vinted listing data for one search. Group the listings by status (condition) and show the median price.amount for each. Suggest an asking price for my [item] in [condition]."
Spot the deals. "Find listings priced at least 30% below the median for the same brand_title and size_title. List them with title, price and url."
Compare countries. "Using vinted_country and price, compare median prices per country for this item and tell me where it's cheapest once I add about [shipping cost] for shipping."
The dataset is also available through the Apify API and the Apify MCP server, so AI agents can run the actor (epicscrapers/vinted-search-scraper) and read its results directly.
Run it from the API
curl --fail-with-body --request POST \"https://api.apify.com/v2/acts/epicscrapers~vinted-search-scraper/run-sync-get-dataset-items?format=json" \--header "Authorization: Bearer ${APIFY_TOKEN}" \--header "Content-Type: application/json" \--data '{"keywords":["nike"],"country":"it","maxProducts":20}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('epicscrapers/vinted-search-scraper').call({keywords: ['nike'],country: 'it',maxProducts: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Output
Results go to the run's default dataset. Use the Overview or Price tracking view, or export everything as JSON, CSV, Excel, XML or HTML. JSON keeps the nested price, user and photo objects; CSV and Excel flatten them into columns.
price.amountis a string in the listing's currency,price.currency_code. Convert before calculating, and don't average across currencies without converting.- Duplicate listings within one search are removed. Overlapping searches in one run can return the same listing twice; match them by
id. - Missing values are
nullor left out. The catalog doesn't include full descriptions, seller ratings or shipping costs.
FAQ
Why did I get fewer results than I asked for?
The search may have fewer matching listings, or a search failed (see RUN_SUMMARY). With Save only, later runs save only what changed, so a run with nothing new saves nothing. Check the log for details.
How many results can I get?
All of them. Vinted itself returns at most 960 results per search. When Products per search is above 960 or 0 (no limit), the actor asks Vinted how many listings the search really has, splits it into price ranges (and conditions, when one price has more than 960 listings) that each fit, and collects them one by one without duplicates. The log shows the real total at the start. In a test, "dyson airwrap" on vinted.fr returned 12,457 of the 12,517 listings Vinted counted, in under three minutes; listings that are added or removed during the run explain the difference.
Every listing is charged, and broad searches can have hundreds of thousands of listings ("levis" on vinted.fr has over 2 million), so set a maximum cost per run. The actor stops cleanly when it is reached. Results past the first 960 are in price order, not the search's own sort order.
Why did the first tracking run save everything?
The first run for a search has nothing to compare with, so it saves all current listings as a baseline. From the second run on, only new listings and price drops are saved.
Do I need a Vinted account, cookies or proxies?
No. The actor handles Vinted access and uses a residential connection in each country itself. It doesn't log in or use your Vinted account.
Can I filter by brand, size, condition or category?
Yes. Set the filters on Vinted, copy the URL from your browser and paste it into Vinted URLs. Keyword searches support country and price filters only.
Can I get sold listings or sold prices?
Not with this actor. A listing that disappears may have been sold, hidden or deleted, and the actor doesn't tell you which. To check what an item really sells for, use eBay Sold Listings API, which returns completed eBay sales.
Can I scrape a seller's wardrobe or a single item page?
A seller's wardrobe, yes: add their profile URL (/member/...) to Vinted URLs and the actor saves all their active listings, with the same fields as search results. Price tracking works too, so a scheduled run reports the seller's new listings and price drops. Single item pages aren't supported.
What happens when a search fails?
Every request to Vinted is retried, and a search whose connection keeps failing is retried with a new residential connection. If a search still fails, the run continues with the other searches. The log and the run's status message name the failed searches, and the RUN_SUMMARY record in the key-value store lists every search with its status, the number of listings scraped and saved, and the error. If searches failed and nothing was saved, the run fails, so you aren't charged for listings. A run where every search worked but nothing new was found (for example with Save only) still succeeds.
Why did my run stop early?
If the log says the charge limit was reached, the run hit its maximum cost or your account's spending limit. Everything collected before that is saved. Raise the limit in the run options to collect more.
Can I use it to source items for resale?
Yes. Search your brands in several countries, sort by price or use saveOnly, and compare total_item_price with what the item sells for elsewhere. Asking prices are not sale prices, and cross-border shipping and fees are not included in the country summary.
Is it legal to scrape Vinted?
The actor collects publicly visible listing data. It doesn't buy items, contact sellers or read private messages. Public data can still be personal data, so you are responsible for how you use it, including Vinted's terms and laws such as GDPR.
Cost
This actor uses pay-per-event pricing. You pay for what you use, with no subscription. Prices depend on your Apify plan; the lowest price applies on the Free plan and the highest discount on Gold and above:
| Event | Free plan | Bronze | Silver | Gold and above | Charged when |
|---|---|---|---|---|---|
| Actor start | $0.01 | $0.01 | $0.005 | $0.005 | Once per run (per GB of memory, minimum one). |
| Listing | $0.003 | $0.002 | $0.0015 | $0.00075 | A listing is saved to the dataset. |
| Tracked search | $0.04 | $0.035 | $0.03 | $0.025 | Once per URL or keyword search with price tracking on, even when nothing new is found. |
Example runs on the Free plan (a keyword search without tracking):
| Run | Cost |
|---|---|
| 20 listings | $0.07 |
| 960 listings | $2.89 |
| 12,457 listings (all "dyson airwrap" listings on vinted.fr) | $37.38 |
| 3 countries x 100 listings | $0.91 |
Start with a small Products per search to check results, and remember it applies to every URL, keyword and country. With price tracking, a lower limit also lowers what each search checks. Set a maximum cost per run; the actor stops cleanly when it's reached. The Pricing tab always shows the current prices for your plan.
Related Actors
- eBay Sold Listings API: completed eBay sales, to check what an item really sells for.
- eBay Search Results Scraper: active eBay listings across 17 marketplaces.
- Wallapop Seller Scraper: a Wallapop seller's active listings, profile stats and reviews.
- Kleinanzeigen Scraper: search results from kleinanzeigen.de.
- Whatnot Scraper: Whatnot listings, livestreams, products and users.
- Etsy Scraper: Etsy product and keyword research.
Support
Report problems or request features in the Issues tab, email jwlben11@gmail.com, or use the feedback form. Include the run ID, the input and what you expected. We read every issue.
This actor is not affiliated with or endorsed by Vinted. "Vinted" is a trademark of Vinted UAB.