Vinted.fr - Listings, Item Detail & Seller Reviews
Pricing
from $1.00 / 1,000 listing results
Vinted.fr - Listings, Item Detail & Seller Reviews
Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with brand/price/condition/sort filters, paste item or seller URLs, or pull a seller's feedback history. Returns title, brand, price, condition, size, photos, seller rating per listing; reviews mode returns all seller ratings.
Pricing
from $1.00 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Vinted.fr Scraper
Pull rich listing data from Vinted.fr, France's C2C second-hand fashion marketplace. Search by keyword with brand, price, condition, and sort filters, paste item or seller/member links directly, or pull a seller's complete feedback history. Every record includes identity, price, brand, and photos out of the box; turning on detail enrichment adds full description, condition, size, material, colour, and the seller's live feedback rating and count.
Why This Scraper?
- Real listing filters, not guesswork. Brand id, price range, condition, and sort order all map directly to Vinted's own search parameters and are verified to narrow results, not just accepted and ignored.
- Honest pricing, no fabricated discounts. Vinted 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 the real listed price and does not invent a wasPrice/discount field that the site itself doesn't support.
- Full item detail from the item's own page. Condition, size, material, colour, upload date, and full description, matched against the listing's own structured data and on-page attributes.
- Native seller feedback. Overall rating, feedback count, and every individual feedback entry (reviewer, date, star rating, and comment) sourced from Vinted's own feedback system, no third-party review vendor.
- Three ways in. Keyword/brand/category search with real filters, paste any item or seller/member URL (a seller URL walks their whole storefront), or pull a seller's full feedback history directly.
- Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.
- Resume & recurring updates. Turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED records on every scheduled run — a sold or removed listing comes back as EXPIRED — or resume one specific interrupted crawl with
resumeFromRunId.
Input
| Field | Description |
|---|---|
| Mode | search, url or reviews. |
| Search keywords | Free-text keywords (search mode). Item budget splits evenly across them. |
| Category ID | Vinted catalog id (search mode, optional). Narrows a keyword search, or browses the whole category alone. |
| Brand ID | Vinted brand id (search mode, optional). |
| Condition | Filter to one or more condition levels (search mode, optional). |
| Minimum / Maximum price (EUR) | Price range (search mode, optional). |
| Sort order | relevance (default), newest_first, price_low_to_high, price_high_to_low (search mode). |
| URLs to scrape | Item pages (/items/<id>-<slug>) or seller/member pages (/member/<id>) to paste (url mode). A member URL enumerates every item that seller has listed. |
| Sellers | Usernames, numeric member ids, or /member/<id> URLs to fetch feedback for (reviews mode). |
| Fetch item detail | Adds description, condition, size, material, colour, and the seller's feedback rating/count. On by default. |
| Max pages per search | Result pages walked per keyword/category/URL/seller entry. 0 (default) = unlimited, bounded by Max items. |
| Max items total | Hard cap on total items/reviews returned across the run. Default 20; 0 = unlimited. |
| Proxy | Apify Proxy — Datacenter by default (works reliably and on every plan); switch to Residential only if you see failed runs. |
| Resume from a previous run | Continue one specific previous run/dataset: records already collected there are skipped. For recurring monitoring of the same search/URLs/sellers, use Incremental mode instead — see "Resume & recurring updates" below. |
| Incremental changes for scheduled runs | Daily/recurring monitoring of the same search/URLs/sellers. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below. |
| State key | Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your mode/search/URL/seller/detail settings when left empty. |
| Emit unchanged records | Incremental mode only. Also return records unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
| Emit expired records | Incremental mode only. Also return records from a previous run no longer found (sold/removed), marked EXPIRED, once a run has fully scanned the tracked scope (not capped, not a resume). Adds and bills extra synthetic rows. |
mcpConnectors | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | Notion connector only: page under which item pages are created. |
maxNotifyListings | Cap on items exported to each connector per run. Does not affect the dataset. |
Data You Get
| Field | Example value |
|---|---|
| itemId | 00000001 |
| title | Sample Listing Title |
| url | https://www.vinted.fr/items/00000001-sample-listing-title |
| brandTitle | Sample Brand |
| priceAmount / currency | 15.0, EUR |
| promoted | false |
| photos[] | [{"url": "https://images.example.com/000000000.jpeg", "isMain": true}] |
| seller | {"id": "00000002", "username": "sample_seller"} |
| description (fetchDetails) | The listing's own description text appears here when present. |
| condition (fetchDetails) | Bon état |
| size (fetchDetails) | M |
| material (fetchDetails) | Coton |
| color (fetchDetails) | Bleu |
| categoryPath (fetchDetails) | Femmes Vêtements |
| catalogId (fetchDetails) | 0000 |
| sellerFeedbackRating / sellerFeedbackCount (fetchDetails) | 4.9, 120 |
Sample shape: values above are illustrative placeholders, not from a live listing.
Reviews mode output
| Field | Example value |
|---|---|
| sellerId | 00000002 |
| reviewId | 0000000001 |
| itemId | 00000003 |
| reviewerUsername | sample_reviewer |
| rating | 5 |
| body | Sample feedback comment text. |
| isSystemFeedback | false |
| createdAt | 2026-01-01T00:00:00+01:00 |
| sellerFeedbackRating / sellerFeedbackCount | 4.9, 120 |
Sample shape: values above are illustrative placeholders, not from a live seller.
Incremental mode only. When incrementalMode is on, every returned record (items or
reviews) also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this record was first observed by this monitoring campaign |
lastSeenAt | When this record was last observed |
No wasPrice / discount field, by design
Vinted item pages and listing cards show a second amount next to the price (e.g. "15,00 €" then "16,45 € Protection acheteurs incluse"). That second figure is the current price plus the buyer-protection fee charged at checkout, verified against the item page's own pricing breakdown, where the delta between the two exactly equals the disclosed fee. It is not a former/"was" price, and Vinted does not otherwise expose a markdown history for peer-to-peer listings. This scraper reports only priceAmount, the real listed price, rather than fabricating a discount field the marketplace doesn't have.
How to Use
Basic keyword search
{"mode": "search","queries": ["sample keyword"],"maxItems": 20}
Search with brand, price range, condition, and sort
{"mode": "search","queries": ["sample keyword"],"brandId": "53","minPrice": 5,"maxPrice": 60,"conditions": ["3", "4"],"sortBy": "price_low_to_high","fetchDetails": true,"maxItems": 20}
Paste item or seller/member links
{"mode": "url","urls": ["https://www.vinted.fr/items/00000001-sample-listing-title","https://www.vinted.fr/member/00000002"],"maxItems": 20}
Pull a seller's full feedback history
{"mode": "reviews","sellers": ["00000002"],"maxItems": 100}
sellers accepts a numeric member id or a full /member/<id> URL (find the id in the seller's profile page URL).
Filters (search mode)
| Field | Notes |
|---|---|
queries | Free-text keywords; item budget splits evenly across them. |
categoryId | Vinted catalog id, from a category page URL: vinted.fr/catalog/<id>-<name>. |
brandId | Vinted brand id, from a brand page URL: vinted.fr/brand/<id>-<name>. |
conditions | Filter to one or more condition levels (new with tags, new without tags, very good, good, satisfactory). |
minPrice / maxPrice | EUR price range. |
sortBy | relevance (default), newest_first, price_low_to_high, price_high_to_low. |
Resume & recurring updates
There are two different things here — pick the one that matches what you're doing:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search/URLs/sellers every day and receive only changes | incrementalMode |
| Keep separate monitoring campaigns for similar scopes | distinct stateKey values |
| Run a normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips records already collected there, returning only the remaining new ones.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same scope by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED records by default — duplicates and unchanged records are suppressed (and not charged). Because Vinted is a C2C resale marketplace, a listing that sells is gone for good, so EXPIRED is a real, useful signal here, not noise — turn on emitExpired to also get those rows. Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per mode and search/URL/seller/detail setup automatically; set stateKey to name or deliberately share a monitoring campaign. Covers every mode: search, url (both pasted item links and member enumeration), and reviews.
Scheduled-run example — same search, run daily:
Day 1 (first run ever for this search):
{ "mode": "search", "queries": ["nike"], "incrementalMode": true }
→ every item comes back with "changeType": "NEW".
Day 2 (the schedule fires again, identical input):
{ "mode": "search", "queries": ["nike"], "incrementalMode": true }
→ items whose price/condition/etc. changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new items come back as "changeType": "NEW", items that sold and were relisted come back as "changeType": "REAPPEARED" — and items still listed, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on. Turn on emitExpired to also get a synthetic EXPIRED row for any tracked item that sold or was removed.
Connection
Vinted.fr works reliably over a Datacenter connection, so it stays the cost-efficient default and works on every Apify plan, including free tier. Switch to Residential in the Proxy field only if you notice a rise in failed runs.
Export to your apps (optional)
Select one or more MCP connectors (Notion, Linear, Airtable, or a custom Apify MCP connector) under mcpConnectors to mirror results into the app you already use, alongside the dataset. Authorize the connector once under Apify → Settings → Integrations. For Notion, also set notionParentPageUrl to the page results should be created under. maxNotifyListings caps how many items are sent per connector per run (does not affect the dataset).