Vinted France Scraper at a glance
Vinted France Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce 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.00 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
- Ecommerce, Automation, Developer Tools
- Region
- Europe
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
Scrape Vinted.fr second-hand fashion listings by keyword, brand, price, condition, sort filters or URL. Extract titles, brands, prices, sizes, conditions, photos and seller ratings. Supports item and seller URLs, plus full seller feedback and review history.
What Vinted France Scraper can do
- Three ways in. Keyword/brand/category search with real source-side filters, paste any item or seller/member URL directly, or pull a seller's full feedback history.
- Real search filters, not guesswork. Brand id, price range, condition and sort order map directly to Vinted.fr's own search parameters, verified to narrow results rather than being accepted and silently ignored.
- Full item detail from the item's own page. Condition, size, material, colour, category and full description, read from the listing's own structured data and on-page attributes, not a third-party estimate.
- Honest pricing. Vinted.fr shows a second, larger figure next to the listed price ("buyer protection included"), which is the current price plus a checkout fee, never a former price. This scraper reports only the real listed price and does not invent a wasPrice or discount field the marketplace itself doesn't expose.
- Native seller feedback. Overall rating, feedback count and every individual review (reviewer, date, star rating, comment) sourced from Vinted.fr's own feedback system.
- Built for schedules. Incremental mode returns only new, changed and reappeared listings on recurring runs; because a sold listing on a C2C marketplace is gone for good, a sold or removed listing comes back marked EXPIRED once a full scan confirms it.
Choose what to collect
These inputs let you configure Vinted France Scraper - Clothes, 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 Vinted'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). |
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 name (e.g. 'Robes') or a Vinted catalog id, e.g. '1242'. A name shared by several categories (e.g. 'Baskets') stops the run and lists the choices; write it as 'Hommes > Chaussures > Baskets' to pick one. Find ids in a category page URL: vinted.fr/catalog/-. Narrows a keyword search, or browses the whole category when Search keywords is left empty. |
brandIdstring | A brand name (e.g. 'Nike') or a Vinted brand id, e.g. '53'. An unknown brand stops the run with a clear message. Ids are in a brand page URL: vinted.fr/brand/-. |
conditionsarray | Only return items in these conditions. Leave empty for any condition. |
brandIdsarray | Extra brands as names or numeric Vinted brand ids; combined with Brand. Leave empty for any brand. |
colorIdsarray | Numeric Vinted colour ids (as in the color_ids[] filter of a Vinted search URL). A non-numeric entry stops the run with a message naming it. |
Show 18 more inputs
| Input | What it controls |
|---|---|
sizeIdsarray | Numeric Vinted size ids (as in the size_ids[] filter of a Vinted search URL). A non-numeric entry stops the run with a message naming it. |
minPriceinteger | Only return items priced at or above this amount. |
maxPriceinteger | Only return items priced at or below this amount. |
sortBystring | Order of the returned results. |
urlsarray | Paste Vinted links: item pages (/items/-), seller pages (/member/), search pages (/catalog?search_text=...), category pages (/catalog/-) and brand pages (/brand/-). Seller, search, category and brand links enumerate every listing they show. Left untouched, this scrapes one example of each distinct shape: seller, item, keyword search, filtered search, sub-category, top-level category and brand. Filter fields above are ignored in this mode. |
sellersarray | Seller usernames, numeric member ids, or full /member/ URLs to fetch feedback for. |
fetchDetailsboolean | Adds full description, condition, size, material, colour, upload date, and the seller's feedback rating/count. Identity, price, brand, and photos are already included without this toggle. |
maxPagesinteger | Stop after this many result pages per keyword/category/URL entry or per seller's reviews. 0 means the built-in hard cap of 1000 pages. Bounded by Max items below. |
maxItemsinteger | Hard cap on total items (listings or reviews) returned across the whole run. Capped at 100,000 per run; 0 means that cap. |
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 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, search/URL/seller and detail settings, different searches 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 or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Output field names that should NOT make a record count as UPDATED, even when they changed. Matches a field name at any nesting depth (for example price inside nested objects). Ignored fields are still returned in the output. Photo links are already compared without their rotating host and signature. Favourite and view counts, the fee figures, the promoted flag and the seller's running feedback tally are always ignored this way. |
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. |
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)sellerUsernameSeller (text)sellerFeedbackRatingSeller rating (number)sellerFeedbackCountSeller feedback count (number)urlURL (link)Show 19 more fields
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)descriptionDescription (text)categoryCategory (text)materialMaterial (text)colorsColours (array)conditionSchemaCondition (schema.org) (text)isReservedReserved (boolean)favouriteCountFavourites (number)photoCountPhotos (number)sellerBadgesSeller badges (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"itemId": "00000001",
"title": "Sample knitted jumper",
"url": "https://www.vinted.fr/items/00000001-sample-knitted-jumper",
"path": "/items/00000001-sample-knitted-jumper",
"brandTitle": "Sample Brand",
"priceAmount": 15,
"currency": "EUR",
"isVisible": true,
"promoted": false,
"photos": [
{
"id": 1,
"url": "https://images.example.com/000001.jpeg",
"width": 800,
"height": 1200,
"isMain": true
}
],
"seller": {
"id": "00000002",
"username": "sample_seller",
"photo": "https://images.example.com/seller-000002.jpeg",
"business": false,
"feedbackRating": 0.98,
"feedbackCount": 120
},
"description": "Full listing description text appears here when present.",
"mainImage": "https://images.example.com/000001.jpeg",
"conditionSchema": "UsedCondition",
"condition": "Bon état",
"size": "M",
"material": "Coton",
"color": "Bleu",
"categoryPath": "Femmes Vêtements",
"catalogId": "1242",
"isReserved": false,
"sellerId": "00000002",
"sellerBusiness": false,
"sellerFeedbackRating": 0.98,
"sellerFeedbackCount": 120,
"sellerUsername": "sample_seller",
"scrapedAt": "2026-01-01T00:00:00+00:00"
}Ways to use this data
- Resale price research: track a keyword or brand across the marketplace 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 dealing with them.
- Marketplace analytics: build a dataset of brand, price and condition trends for a category or set of keywords.
- Storefront monitoring: watch one seller's whole listing catalogue for new items through URL mode's member enumeration.
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 France Scraper return?
The documented output for Vinted France 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 France Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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 changes for scheduled runs. Each run then returns only new, updated and reappeared records, and unchanged ones are not billed unless you turn on Emit unchanged records.
What's the difference between Resume and Incremental mode?
Resume from a previous run continues one specific interrupted run so you don't re-collect or re-pay for what it already delivered; you paste its run or dataset ID once. Incremental mode is for recurring monitoring of the same search, URLs or sellers: the actor remembers its own state between scheduled runs, so you never paste an ID, and it keeps classifying records as new, changed, unchanged, reappeared or expired every time it runs.
Why did my run return fewer listings than Max items?
Two run shapes can do this. First, in a search with more than one keyword, a result page cut short by a keyword's share of Max items still marks the rest of that page as seen internally, so any of those listings that a later keyword also matches are skipped there too and returned by neither; keep Max items high enough to clear a full page per keyword, or run heavily-overlapping keywords separately. Second, in Incremental mode, the per-target budget is drawn from records read during the walk, not only from ones actually returned, so a recurring run where most records are unchanged (and suppressed) can stop at its budget having returned far fewer rows than Max items, or none, even with newer records left unread; raise Max items above the tracked scope on recurring runs (and sort searches by newest first) if you want every change picked up.
Why did the run right after a Resume plus Incremental bootstrap mark everything UPDATED?
Starting Incremental mode together with resumeFromRunId on a fresh state key seeds every id the resumed run already delivered into the new baseline without a stored snapshot to compare against. The next ordinary run (without Resume) that reads each of those records finds nothing on file to diff beyond "it exists", and returns (and bills) it as UPDATED with every field listed as changed. This happens once per record, normally on the very next run; treat those UPDATED rows as informational. Once a record has been read this way, its classification is accurate from then on.
