Vinted Multi-Country Scraper - Listings, Sellers & Reviews
Pricing
from $1.50 / 1,000 results
Vinted Multi-Country Scraper - Listings, Sellers & Reviews
Scrape Vinted across 27 country marketplaces: keyword search with brand, price and condition filters, item and seller URLs, or a seller's full feedback history. Returns price, currency, condition, size, view and favourite counts, seller rating and profile depth per listing.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Vinted Scraper: Listings, Sellers & Reviews Across 27 Markets
Vinted Scraper turns Vinted, Europe's C2C secondhand fashion marketplace, into structured listing, seller and review data across all 27 of its country marketplaces. Search by keyword with brand, price and condition filters, paste item, seller or catalogue links directly, or pull a seller's complete feedback history. Every listing carries price, currency, brand, size, condition, favourite count and photos, with full description and seller-profile depth available on request. Export to JSON, CSV or Excel, or read results straight through the API.
Why This Scraper?
- Three ways in. Keyword search with source-side brand, price and condition filters; paste any item, seller/member or catalogue link; or fetch a seller's full feedback history.
- 27 country marketplaces, one actor. Each market has its own catalogue, currency and language, and item and seller ids resolve across all of them.
- Depth on demand. Switch on full item description plus seller reputation, response time and bundle discount per run, and pay the enrichment charge only when you use it.
- Mixed-market URL runs. Paste links from several countries in one URL-mode run; each link keeps its own market instead of falling back to a single country.
- Built for schedules. Incremental mode returns only new, changed and reappeared listings on recurring runs, and, with Emit expired on, a sold or removed listing comes back marked EXPIRED once a full scan confirms it is gone.
- Loud failures, not silent empties. A run that could not read the marketplace fails with a clear message instead of returning an empty dataset that looks like "no results".
- Resume without re-billing. Continue one interrupted run from its own previous dataset without re-collecting or re-charging what it already delivered.
Use Cases
- Resale price research: track a keyword or brand across a market to benchmark asking prices, sizes and condition mix.
- Deal and restock alerts: schedule a search with incremental mode on and get notified only about new or changed listings.
- Seller due diligence: pull a seller's profile and complete feedback history before buying from or partnering with them.
- Marketplace analytics: build a dataset of brand, price and condition trends across one or several country marketplaces.
- Closet monitoring: watch one seller's whole listing catalogue for new items through URL mode.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
itemId | "0000000000" |
title | "Sample knitted winter sweater" |
brandTitle | "Sample Brand" |
priceAmount | 12.5 |
currency | "EUR" |
condition | "Very good" |
conditionSchema | "UsedCondition" (item detail, when the page provides it) |
size | "M" |
color | "Green" (item detail) |
description | full listing text (item detail, when Fetch item detail is on) |
uploadDate | "12 h" (item detail) |
favouriteCount | 18 |
viewCount | null (the site no longer publishes view counts, so this is reported as unknown rather than a fake 0) |
promoted | false |
image | main photo URL |
photos | full photo list with id, width and height |
url | link to the listing |
sellerId | "0000000001" (with item detail or seller profiles on; otherwise in seller.id) |
seller.username | "sample_seller" |
seller.business | false |
seller.feedbackReputation | 4.9 (seller profile, when enabled) |
seller.feedbackCount | 312 (seller profile, when enabled) |
seller.city | "Sample City" (seller profile, when enabled) |
seller.bundleDiscount | 10 (seller profile, when enabled) |
changeType | "NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; incremental mode only) |
Reviews mode returns a different row shape: one entry per feedback with reviewId, rating, body, createdAt, reviewerUsername, plus the seller's own sellerFeedbackRating and sellerFeedbackCount repeated on every row.
How to Use
- Pick a Mode:
search(keyword),url(paste links) orreviews(a seller's feedback). - Search mode: type Search keywords, and optionally narrow with Category ID, Brand ID, Condition or price. URL mode: paste item, seller/member or catalogue links. Reviews mode: paste seller ids or member links.
- Pick the Country marketplace, and switch on Fetch item detail or Fetch seller profiles for extra depth.
- Set Max items to control run size and cost, then click Start.
Search a keyword with filters:
{"mode": "search","queries": ["nike air max"],"conditions": ["2"],"minPrice": 10,"maxPrice": 60,"country": "de","maxItems": 50}
Paste links (item and seller, mixed markets):
{"mode": "url","urls": ["https://www.vinted.fr/items/0000000000-sample-knitted-winter-sweater","https://www.vinted.de/member/0000000001"],"fetchDetails": true,"fetchSellerProfiles": true}
A seller's full feedback history:
{"mode": "reviews","sellers": ["0000000001"],"country": "de"}
Recurring monitoring of a search, with expiry tracking on:
{"mode": "search","queries": ["vintage denim jacket"],"country": "fr","incrementalMode": true,"emitExpired": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/vinted-marketplace-scraper").call(run_input={"mode": "search", "queries": ["nike air max"], "country": "de"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["priceAmount"], item["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/vinted-marketplace-scraper').call({mode: 'search', queries: ['nike air max'], country: 'de',});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How the item budget is split across multiple targets
Max items is the run's total cap. When a run carries more than one target, meaning more than one search keyword, several pasted seller or catalogue links, or several sellers in reviews mode, that cap is divided evenly across them so a multi-target run returns a share from each instead of spending the whole budget on the first one. Pasted item links return one record each and count against the same total. Max pages additionally limits how many result pages each individual target may walk.
A note on overlapping targets under a low cap
A result page holds 48 listings. When a target's share of Max items runs out part-way through a page (with the default Max items of 20 that happens on the very first page), the rest of that page's listings are recognised as already looked at for the remainder of the run, even though they were never returned. With a single target this is invisible, because nothing runs after it. It only matters when you combine several overlapping listing targets in one run (for example two keyword searches that both match the same dual-branded listing, or a pasted catalogue link and a seller link that share an item): a listing left over on the first target's cut-short page is then silently skipped by a later target too. Example: searches "nike" and "adidas" with Max items 10 give each a share of 5; "nike" returns its first 5 listings, and if listing number 7 on that page also appears in the "adidas" results, neither search returns it. Reviews mode is not affected, since each review belongs to exactly one seller. This never causes a false EXPIRED row (expiry detection only runs after every target reached its genuine natural end, which a cut-short target never does) and it does not affect Resume (which reads back the previous run's own dataset, not this in-run bookkeeping). Workaround: give overlapping searches or links a generous Max items, or run them separately, rather than combining them under a tight shared cap in a single run.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips everything that run already collected, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same search, URLs or sellers. Each listing is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEARED, orEXPIRED, meaning sold or removed, only after a run that scanned the whole tracked scope and only withemitExpiredon.stateKeynames or shares the stored state; leaving it empty derives one automatically from the mode, country and target settings. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify -> Settings -> Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search, url, or reviews. |
country | string | de | Country marketplace to search, and the fallback market for URLs that don't name one. |
queries | array | ["nike"] | Search keywords (search mode). The budget splits evenly across them. |
categoryId | string | (none) | A catalogue id. Narrows a search, or browses a whole category alone (search mode). |
brandId | string | (none) | A brand id (search mode). |
conditions | array | (none) | Restrict results to these conditions (search mode). |
minPrice | integer | (none) | Only items priced at or above this amount (search mode). |
maxPrice | integer | (none) | Only items priced at or below this amount (search mode). |
sortBy | string | relevance | relevance or newest_first (search mode). |
urls | array | sample member link | Item, seller/member or catalogue links to scrape (url mode). Each keeps its own market. |
sellers | array | sample member link | Seller numeric ids or member links to fetch feedback for (reviews mode). |
fetchDetails | boolean | false | Add full description, colour, upload date and schema condition per listing. Billed as the detail-enrichment surcharge. |
fetchSellerProfiles | boolean | false | Add seller depth (reputation, response time, bundle discount and more) per listing. Also billed as the detail-enrichment surcharge. |
maxPages | integer | (none) | Stop each search/URL/seller after this many result pages. 0 or empty = as many as needed. |
maxItems | integer | 20 | Hard cap on total records returned across the whole run. 0 = unlimited. |
proxy | object | Apify residential proxy | Connection settings. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
resumeFromRunId | string | (none) | Continue one interrupted run without re-collecting or re-charging its records. |
incrementalMode | boolean | false | Return only new, changed, reappeared and expired records on scheduled runs. |
stateKey | string | (none) | Name or share an incremental-mode state; auto-derived when left empty. |
emitUnchanged | boolean | false | Also return (and bill) unchanged records. |
emitExpired | boolean | false | Also return (and bill) records no longer found after a complete scan. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"itemId": "0000000000","title": "Sample knitted winter sweater","url": "https://www.vinted.de/items/0000000000-sample-knitted-winter-sweater","path": "/items/0000000000-sample-knitted-winter-sweater","brandTitle": "Sample Brand","priceAmount": 12.5,"currency": "EUR","size": "M","condition": "Very good","conditionSchema": "UsedCondition","color": "Green","description": "Sample listing description text.","uploadDate": "12 h","favouriteCount": 18,"viewCount": null,"promoted": false,"photos": [{ "id": 1, "url": "https://images.example/sample.jpg", "width": 800, "height": 800 }],"image": "https://images.example/sample.jpg","sellerId": "0000000001","seller": {"id": "0000000001","username": "sample_seller","business": false,"city": "Sample City","feedbackReputation": 4.9,"feedbackCount": 312,"bundleDiscount": 10},"scrapedAt": "2026-01-01T00:00:00+00:00"}
Plan Requirement
The default connection setting already uses the residential proxy pool, which this marketplace requires for reliable reads, and it works out of the box. The actor establishes a fresh connection automatically when one is refused. For large or frequent runs, more proxy headroom in your Apify plan reduces how often that has to happen.
FAQ
How much does it cost?
You pay per record returned, plus the detail-enrichment surcharge only on listings where you switched on item detail and/or seller profiles. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Vinted?
This actor collects only publicly available marketplace data. You are responsible for how you use it: follow Vinted's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing text, prices and seller ratings belong to their respective users.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, changed and reappeared records, and unchanged ones are not billed. With Emit expired on, sold or removed listings come back marked EXPIRED once a run has fully scanned the tracked scope.
Why does my dataset have fewer rows than I expected when I combine several searches, URLs or sellers in one run?
First, Max items is split evenly across every target in the run, so each keyword or link gets only its share. Second, when a target's share runs out part-way through a 48-listing result page, the rest of that page is treated as already looked at for the rest of the run. That is harmless for a single target, but a listing that also matches a later target in the same run is then skipped by that target too: for example, searches "nike" and "adidas" with Max items 10 return 5 each, and a listing sitting 7th on the "nike" page that also shows up under "adidas" is returned by neither. Give overlapping searches or links a generous Max items, or run them separately, to avoid it.
Why did my run fail instead of returning an empty dataset?
If the marketplace refuses every request, the run stops with a clear message so "no listings for my search" is never confused with "nothing could be read". Run it again in a few minutes. If only some pages were refused but real rows were delivered, you still get what was found, reported as partial results.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
π Want more Vinted data?
Pair this actor with these related scrapers from the same team:
| π·οΈ Vinted.fr Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with... | π·οΈ bol.com Scraper Scrape bol.com products: title, price, list price and discount, EAN, brand, images... |
| π·οΈ Daangn Scraper From $1/1K. Scrape Daangn (λΉκ·Ό) marketplace listings by keyword and region. Returns 35+... | π·οΈ Chrono24 Scraper Scrape Chrono24 luxury watch listings by keyword, filters or URL. Extract 50+ fields... |
| π KLEKT Sneaker & Apparel Resale Scraper Scrape sneaker and streetwear listings from KLEKT (klekt.com). Browse the catalog with... | π Poshmark Scraper Scrape Poshmark fashion-resale listings: keyword search, brand and category browse, sold... |
π Browse all abotapi scrapers
π¬ Support & custom scrapers
- π Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- π οΈ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- β Enjoying it? A quick review on the actor page helps other users find it.