Vinted Scraper at a glance
Vinted Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes item id, title, change type (incremental mode), brand and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 33 options
Scrape Vinted across 27 country marketplaces by keyword, filters, item or seller URL. Extract prices, currencies, brands, sizes, conditions, views, favourites, seller ratings and profiles. Supports brand, price and condition filters, plus full seller feedback history.
What Vinted Scraper can do
- 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".
Choose what to collect
These inputs let you configure Vinted Scraper - Listings, Prices, Sellers & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' finds listings by keyword with the marketplace's own filters. 'url' scrapes any item page or seller/member page you paste. 'reviews' pulls a seller's full feedback history (rating + every comment). |
countrystring | Which country's catalogue to search, and which market session to use when a pasted URL does not name one. Each country has its own catalogue, language and currency; item and seller ids work across all of them. Pasted URLs always pin their own market from the URL itself. |
queriesarray | One or more free-text keywords, e.g. 'nike air force' or 'robe vintage'. The item budget (Max items below) is split evenly across keywords. |
categoryIdstring | A category id (e.g. '1242') or a category NAME as shown on the site (e.g. 'Sneaker'); a name is looked up in the site's own category list and the run stops with a clear error when nothing matches. Narrows a keyword search, or browses the whole category when Search keywords is left empty. Search mode only. |
brandIdstring | A brand id (e.g. '53') or a brand NAME (e.g. 'Nike'); a name is looked up with the site's own brand search and the run stops with a clear error when nothing matches. Search mode only. |
conditionsarray | Only return items in these conditions. Leave empty for any condition. Search mode only. |
minPriceinteger | Only return items priced at or above this amount, in the selected market's currency. Search mode only. |
Show 26 more inputs
| Input | What it controls |
|---|---|
maxPriceinteger | Only return items priced at or below this amount, in the selected market's currency. Search mode only. |
sortBystring | Order of the returned results: the marketplace's default relevance ranking, newest first, price low to high or price high to low. Search mode only. |
urlsarray | Paste item pages (/items/ or /items/-), seller/member pages (/member/, optional slug or ?page=), catalogue/search pages (/catalog?search_text=..., with filters, order and page), category pages (/catalog/-, the category id is read from the path) or brand pages (/brand/-). A member URL enumerates every item that seller has listed; a catalogue, category or brand URL walks that listing from the page parameter it carries. Each URL's own hostname picks its market (vinted.de.co.uk.com and the others), with or without www. Unsupported links (the m. mobile host, /member//items, /member//feedback) are skipped with a warning. Left untouched, this field works through one example of each supported URL form; the three item-page forms point to the same listing, which is returned once. Filter fields above are ignored in this mode. |
sellersarray | Seller numeric member ids or full /member/ URLs (any country) to fetch feedback for. A pasted URL's own hostname picks the market; a bare numeric id uses the Country marketplace above. |
fetchDetailsboolean | Adds the full description, colour, upload date and schema condition to each listing. Identity, price, brand, size, condition label, view/favourite counts and photos are already included without this toggle. Billed as the per-listing detail-enrichment surcharge when a row is returned. |
fetchSellerProfilesboolean | Adds seller depth to each listing: city, country, feedback reputation with positive/neutral/negative counts, item and follower counts, bundle discount, response time and online status. Also billed as the detail-enrichment surcharge (once per listing, together with Fetch item detail). |
maxReviewsinteger | Reviews mode only: the most feedback entries fetched for each seller. Max items below still caps the whole run. |
maxPagesinteger | Stop after this many result pages per keyword/category/URL entry. Leave empty for as many pages as needed (bounded by Max items below). |
maxItemsinteger | Hard cap on total records (listings or reviews) returned across the whole run. 0 = unlimited: the run keeps going until the source runs out of results. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue an interrupted crawl without returning or charging for records already collected there. For recurring daily monitoring of the same search/URLs/sellers, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED records; a sold/removed listing on this marketplace comes back as EXPIRED. Turn on "Emit unchanged" or "Emit expired" only when you also want those records returned (and billed). State is kept separately per mode, country and search/URL/seller/detail setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode, country, search/URL/seller and detail settings - different setups then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns - and bills - extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found (sold or removed), marked EXPIRED. Only produced once a run has fully scanned the tracked scope - not when Max items capped it, when Resume was used, or when a run scanned nothing. This returns - and bills - extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (view and favourite counters, the relative upload label, signed photo and avatar links, and live seller counters such as last seen online, followers and item count already never trigger a false UPDATED). Use this if another field in your setup turns out to be noisy. A dotted name such as seller.city or photos.width ignores that key inside the nested object or inside every photo. The ignored fields still appear in the output; they are only left out of the comparison. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
querystring | Alias of Search keywords for a single keyword. Used only when Search keywords is empty. |
priceMinnumber | Alias of Minimum price. Used only when Minimum price is empty. |
priceMaxnumber | Alias of Maximum price. Used only when Maximum price is empty. |
catalogIdinteger | Numeric alias of Category ID. Used only when Category ID is empty. |
conditionarray | Alias of Condition (status ids 6, 1, 2, 3, 4). Used only when Condition is empty. |
startUrlsarray | Alias of URLs to scrape, accepting request-list objects. Used when URLs to scrape is empty or still holds its prefilled example list; any other URLs to scrape value wins. |
includeItemDetailsboolean | Alias of the item-detail toggle. Set to true it turns on Fetch item detail, which is billed as the detail-enrichment surcharge per returned listing. If Fetch item detail is already on, it stays on. |
includeSellerDetailsboolean | Alias of the seller-profile toggle. Set to true it turns on Fetch seller profiles, which is billed as the detail-enrichment surcharge per returned listing. If Fetch seller profiles is already on, it stays on. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
itemIdItem ID (text)titleTitle (text)changeTypeChange type (incremental mode) (text)brandTitleBrand (text)priceAmountPrice (number)currencyCurrency (text)conditionCondition (text)sizeSize (text)colorColour (text)favouriteCountFavourites (number)sellerUsernameSeller (text)sellerFeedbackRatingSeller rating (number)Show 21 more fields
sellerFeedbackCountSeller feedback count (number)urlURL (link)imageImage (image)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)sellerIdSeller ID (text)reviewIdReview ID (text)reviewerUsernameReviewer (text)ratingRating (number)bodyComment (text)createdAtDate (date)categoryPathCategory (text)materialMaterial (text)conditionSchemaCondition (structured) (object)descriptionDescription (text)uploadDateUploaded (date)viewCountViews (number)promotedPromoted (boolean)photosPhotos (array)sellerSeller profile (fetchSellerProfiles) (object)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"serviceFee": 1.2,
"totalPrice": 13.7,
"photos": [
{
"id": 1,
"url": "https://images.example/sample.jpg",
"fullSizeUrl": "https://images.example/sample-full.jpg",
"dominantColor": "#a1b2c3",
"width": 800,
"height": 800
}
],
"photoCount": 1,
"sellerUrl": "https://www.vinted.de/member/0000000001",
"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": 0.1,
"soldItemCount": 122,
"boughtItemCount": 57,
"isEmailVerified": true
},
"sellerBadges": [
"ACTIVE_LISTER"
],
"scrapedAt": "2026-01-01T00:00:00+00:00"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Vinted Scraper return?
The documented output for Vinted Scraper includes item id, title, change type (incremental mode), brand, price, currency, condition and size. Availability of each field depends on the source page and the selected mode.
How much does Vinted Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
