πŸ”₯Vinted Scraper avatar

πŸ”₯Vinted Scraper

Pricing

from $0.80 / 1,000 product scrapeds

Go to Apify Store
πŸ”₯Vinted Scraper

πŸ”₯Vinted Scraper

πŸš€ Vinted Data Scraper: Fast & Robust! πŸ”₯ πŸ›’ Items and catalogs πŸ‘₯ User profiles with stats and balances 🏷️ Brands 🌟 Seamlessly integrate with Apify for unparalleled performance & insights. Elevate your business now!🌟 πŸ”₯ Power of direct API access for ultra-fast data extraction in a flash! ⚑

Pricing

from $0.80 / 1,000 product scrapeds

Rating

2.9

(2)

Developer

Bebity

Bebity

Maintained by Community

Actor stats

10

Bookmarked

511

Total users

8

Monthly active users

1.6 days

Issues response

15 days ago

Last modified

Categories

Share

Vinted Scraper β€” items, sellers and deep collection

Vinted Scraper extracts listings and seller profiles from Vinted across 12 marketplaces β€” search by keywords, paste a filtered Vinted URL, or point it at a seller's wardrobe. It returns 33 clean columns per listing, 54 with item details, and 36 per seller β€” pro sellers' public business contact included β€” at $0.001 per item: the most complete Vinted dataset on the Store, at half the market's median price.

πŸš€ Version 2 β€” a full rebuild

This is not a patch. v2 is a ground-up rewrite of the engine, the input schema and the output contract, rebuilt around what Vinted sellers, resellers and price-monitoring teams actually asked for. It breaks Vinted's ~813-result ceiling, runs 4.7Γ— faster, returns more than twice the fields of the median actor, and is priced pay-per-event so AI agents can call it directly. Everything below is measured, not claimed.


What is Vinted Scraper?

Vinted has no public API. Vinted Scraper is that missing API β€” a fast, structured, pay-as-you-go interface to Vinted's catalogue and seller base.

Give it keywords, a Vinted search URL you built in your own browser, or a list of seller profiles. It returns a flat, typed dataset you can export as JSON, CSV, Excel, XML or HTML, push into Google Sheets, or read straight from the Apify API.


What's new in v2

v1v2
Result ceilingsilently capped at ~8135,146 unique measured with Deep scan
Speed, 100 items104 s22 s β€” 4.7Γ— faster
Bandwidth per run~54 MB~0 MB
Fields per listing1233, up to 54 with item details
Seller datanone36 fields, own dataset β€” pro sellers' public contact included
Failed rowssilently droppedvisible, with a reason
Pricingmonthly subscriptionpay-per-event, from $0.001/item
AI agents / MCPnot callablecallable

Breaking change: the v1 input schema mirrored Vinted's raw API. v2's is built around tasks β€” search, filter, follow a seller β€” so you never have to look up an ID by hand again.


Why Vinted Scraper beats Vinted's 813-result wall

This is the single thing every other Vinted scraper stops at, and most never mention.

Vinted's search API refuses to paginate past page 10. Ten pages Γ— 96 rows is 960 raw results β€” about 813 unique once the 15% page-overlap is removed. pagination.total_pages is a decoy: it always reports ceil(960 / per_page), never the real volume. Ask for page 11 and the API errors; the public site answers "Sorry, no results". Every scraper that pages naively stops there.

That cap applies per query, not to the corpus. Turn on Deep scan and the actor slices your price range into narrower bands, searches each independently, and recursively splits any band that comes back full β€” because a saturated band is proof there is more behind it.

StrategyUnique results
Plain pagination778
Fixed price slices2,628
Price cursor1,634
Adaptive price partition (Deep scan)5,146

Measured 5 September 2026 on a broad query. A single band, €0–5, returns 749 uniques; split in half, its halves return 1,878 together β€” Γ—2.51, and still saturated.

And when Deep scan is off while you asked for more than one search can deliver, the run says so in the log, with both numbers β€” instead of reporting a tidy success over truncated data.


Unmatched speed: 22 seconds for 100 items

Speed here is measured, and the measurements are public.

MetricResult
100 items, end to end22.0 s median (was 104.4 s)
Throughput323 requests/minute (was 56)
Bandwidth per run~0 MB (was ~54 MB)
p99 request latency, through proxy8.3 s

Where it came from: the bootstrap step used to download Vinted's 2 MB homepage ~25 times per run just to read nine Set-Cookie headers. A HEAD request returns the same nine headers and zero bytes β€” and gets refused less often, because a 2 MB body on a slow IP was blowing its own timeout and being logged as a block. Concurrency, session-pool sizing and autoscaler warm-up were then tuned against ~90 real runs.

You pay per event, not per second β€” but a faster actor still means fresher data and quicker feedback loops.


What data can Vinted Scraper extract?

Every listing lands as one flat row. Nothing is nested in a raw API blob you have to dig through.

Listing fields β€” 54 columns

GroupFields
Identityid, url, title, brand, size, condition
Pricingprice, currency, totalPrice, serviceFee
Mediaphoto (main image), photos[] (up to 20, each with url, fullSizeUrl up to 1600 px, dominantColor, width, height), photoCount
SellersellerId, sellerLogin, sellerUrl, sellerPhoto, isBusinessSeller
EngagementfavouriteCount, viewCount, promoted
AvailabilityisReserved, isClosed, isVisible, isHidden, itemClosingAction, isHeavyBulky
TiminglistedAt, listedHoursAgo, scrapedAt
Demand signalsfavsPerDay, favouriteRate β€” computed here, served by no one
Contextcountry
πŸ” Item details add-ondescription, category, categoryId, brandId, sizeId, statusId, colors[], attributes{}
πŸ” Shipping, from item detailsshippingFrom, shippingOriginalPrice, shippingDiscount, shippingLowest30d, pickupOnly
πŸ” Seller, from item detailssellerFeedbackRating, sellerFeedbackCount, sellerItemCount, sellerCity, sellerCountry, sellerLastSeenAt, sellerBadges[]
πŸ” HonestydetailError β€” null when the product record arrived. Otherwise why it did not: the listing columns on that row are complete, the add-on columns are empty, and the row was not charged the detail rate

One of those exists nowhere else on the Store:

  • attributes{} β€” the attribute map Vinted attaches per category, flattened to attributes/<key> on export. material on furniture, author / isbn_nav / language_book on books, battery_health and internal_memory_capacity on phones. Whatever Vinted attaches to that category comes through. The two actors that get closest hard-code two clothing attributes and return null for everything else β€” which is what happens if you build the field from a single garment instead of from six categories.

Seller fields β€” 36 columns, in their own dataset

GroupFields
IdentitysellerId, sellerLogin, sellerUrl, sellerPhoto, about, isBusinessSeller
ReputationfeedbackReputation, feedbackCount, positiveFeedbackCount, neutralFeedbackCount, negativeFeedbackCount
TrustisEmailVerified, isGoogleVerified, isFacebookVerified
Trade historytotalItemsCount, soldItemCount, boughtItemCount, itemCount
DealsbundleDiscounts[] β€” the seller's bundle tiers, e.g. 10 % off from 3 items
AudiencefollowersCount, followingCount, followingBrandsCount
Locationcity, countryCode
ActivityisOnline, isOnHoliday, lastSeenAt, scrapedAt
πŸ’Ό Pro contactbusinessName, businessEmail, businessPhone, businessAddress, businessCountryCode, businessLegalCode, businessRegistrar
πŸ“ˆ DerivedsellThroughRate β€” sold Γ· listed, as a percentage

Pro sellers' contact, exactly as Vinted shows it. For a pro seller: the business name, email, phone, registration number and β€” for a company β€” the street address their public profile displays, in a Pro sellers' contact tab. What Vinted keeps private stays empty: a sole trader's personal email or phone is never returned, and private sellers leave all seven columns empty.

sellThroughRate in a single call. No snapshots, no scheduled diffing: the numbers are already in the profile response, so one request tells you whether a seller actually moves stock. The market leader bills this as a dedicated $0.10 event.

Seller rows go to a separate sellers dataset, so one row always means one entity β€” maxItems: 100 returns 100 listings, not 198 mixed-shape rows.

How that compares

Vinted Scraper field coverage compared with 16 other Vinted actors on the Apify Store

On the 47 fields charted, the 16 competing Vinted actors return a median of 18.5. The best of them returns 27; Vinted Scraper returns 46. No competitor returns a pro seller's business contact, registration number or bundle discounts at all. Every cell was read from each actor's live dataset schema and README, not estimated: the rows up to 2.2 on 10 September 2026, the four rows new in 2.3 on 13 September 2026.


How much does it cost to scrape Vinted?

Pay-per-event. You are billed for results, never for time, and never for a run that returns nothing.

EventPriceWhen it fires
Actor start$0.005once per run
Item scraped$0.001one unique listing in the dataset
Seller enriched$0.002one seller profile, only with the add-on on
Item detailed$0.002one listing page parsed, only with the add-on on

$0.001 per item is half the Store's median of $0.002 β€” and it's the same price on every Apify plan, including the free one. Several competitors advertise a lower headline number, but only from the Gold tier upward; on the free and entry plans they charge $0.002 to $0.0035. Vinted Scraper returns nearly twice the fields, at the same price for everyone.

Build your own price with add-ons

The two add-ons are opt-in and billed only when used, so you pay for the shape of data you actually need rather than a bundled price someone else chose:

What you needAdd-onsCost per 1,000 items
Price monitoring, catalogue snapshotsnone$1.01
Lead-gen, seller vettingSeller details (β‰ˆ300 unique sellers)$1.61
Full product records with descriptionsItem details$3.01
Everythingboth$3.61

Actors that bundle descriptions into the base price sit 25% above the market median on every row β€” including the rows you didn't want a description for. Keeping it as an add-on is what lets the base row stay at $0.001.

Cap what a run may cost you

Set Maximum cost per run in the run options and the actor plans its collection around that number before it sends a single request β€” it tells you upfront how many listings your cap covers, collects exactly that many, and stops. You are never handed rows past the cap, and never charged past it either.

The cap counts the add-ons too: with Seller details on, a listing is budgeted at the listing plus its seller, so a $1 cap yields the number of complete records it can pay for rather than a pile of listings and a truncated seller tab.

On the Apify free plan ($5 monthly credit) that's roughly 4,900 listings per month at no cost.


Built for AI agents

v2 is pay-per-event, which is what makes it callable over Apify's MCP server and usable by agents that pay per call. The v1 subscription model was excluded from that channel entirely.

Beyond billing, three design choices make the output safe to hand to a model:

  • 🧱 A declared dataset schema. Every column has a type, and the column set is stable across both collection routes β€” missing values are null, never an absent key. An agent parsing the tenth row sees the shape of the first.
  • 🚨 No silent failures. An input that can't be extracted produces a failure row carrying its reason, in a dedicated failed_items view β€” not a gap. An agent can count, retry or escalate. v1's catch { break; } is exactly how the 813-item ceiling stayed hidden for months.
  • πŸ”’ Pre-computed signals. favsPerDay, favouriteRate, listedHoursAgo and sellThroughRate are derived in the actor, so an agent doesn't burn tokens doing arithmetic over a dataset.

Add the Apify platform on top β€” scheduling, webhooks, monitoring, integrations, proxy rotation, and a REST API over every dataset β€” and the whole thing is one HTTP call away.


How to scrape Vinted data: step by step

  1. Click Try for free at the top of this page.
  2. Choose how to search. Type words into Search keywords, or filter on vinted.fr in your own browser and paste the resulting URL into Vinted search URLs β€” every filter in that URL is parsed automatically. For a specific seller, paste their profile URL into Seller profile URLs, under Advanced filters.
  3. Pick your country β€” com, fr, de, es, it, be, at, cz, pl, pt, ro or co.uk.
  4. Set Max items. Start at 100 to see the shape of the data.
  5. Need more than ~813 results? Turn on Deep scan.
  6. Need descriptions or seller profiles? Tick Include item details and Enrich with seller details.
  7. Click Start, then download from the Storage tab as JSON, CSV, Excel, XML or HTML β€” or pull it from the API.

Input

Vinted Scraper has the following input options β€” click the Input tab for the full schema.

{
"query": "vintage track jacket",
"country": "fr",
"brands": ["Nike", "Stone Island"],
"colors": ["black", "navy"],
"priceMin": 10,
"priceMax": 60,
"sortBy": "newest_first",
"maxItems": 1000,
"deepScan": true,
"includeItemDetails": false,
"includeSellerDetails": false
}

Brands take names. Type Nike or Stone Island the way Vinted spells them, or a Vinted brand ID such as 53 if you have one. The actor looks each one up when the run starts, and the log lists the brands it will filter on β€” 🏷️ Filtering on 2 brands: Nike (53), Stone Island (73306) β€” before it collects anything. A name that matches no brand exactly is never guessed: it is left out, the log names the closest brands Vinted has, and the Failed items tab keeps a row for it.

The power-user path is startUrls: build the search on Vinted with every facet you want β€” brand, size, colour, condition, category β€” paste the URL, and the actor turns it into API parameters for you.

Output example

Everything below is a real row from a real run β€” one seller's wardrobe collected with both add-ons on, 50 of the 54 columns populated. Nothing is hand-written, and the four nulls are explained where they sit: a field that is honestly empty is worth more than a field that is always plausible.

The comments mark who pays for what:

MarkerAdd-onCharged as
(none)always includeditem-scraped β€” $0.001
// + Item detailsInclude item detailsitem-detailed β€” $0.002 on top of the row
second blockInclude seller detailsseller-enriched β€” $0.002 per unique seller
{
"id": 9543696765,
"url": "https://www.vinted.fr/items/9543696765-on-performance-jacket-year-of-the-horse",
"title": "On Performance Jacket Year of the Horse",
"brand": "On Running",
"size": "S",
"condition": "Très bon état", // Vinted's own wording, in the marketplace's language
// ── What it actually costs a buyer ──────────────────────────────────────
"price": 180,
"currency": "EUR",
"serviceFee": 9.7,
"totalPrice": 189.7, // price + serviceFee, precomputed
"shippingFrom": 3.28, // + Item details β€” absent from Vinted's API entirely
"shippingOriginalPrice": 3.28, // + Item details β€” before any seller-funded discount
"shippingDiscount": 0, // + Item details β€” original minus final; 0 here
"shippingLowest30d": 3.28, // + Item details β€” this seller's lowest in 30 days
// ── Images ──────────────────────────────────────────────────────────────
"photo": "https://images1.vinted.net/t/05_00dcc_…/f800/1785574788.jpeg?s=1e0e39e7…",
"photos": [ // up to 20, main photo first
{
"url": "https://images1.vinted.net/t/05_00dcc_…/f800/1785574788.jpeg?s=1e0e39e7…",
"fullSizeUrl": "https://images1.vinted.net/tc/05_00dcc_…/1785574788.jpeg?s=2f603228…",
// the largest version Vinted keeps, up to 1600 px
"dominantColor": "#C8C2B7",
"width": 600, // dimensions of `url` only
"height": 800
},
{ "url": "https://images1.vinted.net/t/04_026e9_…/f800/1785574788.jpeg?s=4f7b715c…", "fullSizeUrl": "https://images1.vinted.net/tc/04_026e9_…/1785574788.jpeg?s=f0df8067…", "dominantColor": "#CAC6BC", "width": 600, "height": 800 }
// …3 more
],
"photoCount": 5,
// ── Seller, on the listing row ──────────────────────────────────────────
"sellerId": 29391665,
"sellerLogin": "avuoyten",
"sellerUrl": "https://www.vinted.fr/member/29391665-avuoyten",
"sellerPhoto": "https://images1.vinted.net/t/01_002c9_…/f800/1788623824.jpeg?s=2f9435f4…",
// the seller's avatar; null when they have none
"isBusinessSeller": false,
// ── Demand signals ──────────────────────────────────────────────────────
"favouriteCount": 20,
"viewCount": 0, // real 0 β€” wardrobe collection counts views, and
// nobody has opened this one yet
"favsPerDay": 0.47, // derived: favouriteCount Γ— 24 Γ· listedHoursAgo
"favouriteRate": null, // null: favourites per view, needs both non-zero β€”
// viewCount is a real 0 here
"isReserved": false,
"isClosed": false,
"isVisible": null, // null: keyword search only β€” this row is from a
// seller's wardrobe, not a search
"isHidden": false, // wardrobe collection; item details, when on, can
// refine this same field from the product record
"itemClosingAction": null, // null: only a closed listing has a closing reason
"promoted": false,
"isHeavyBulky": false,
// ── Freshness ───────────────────────────────────────────────────────────
"listedAt": "2026-08-01T08:59:48.000Z",// derived from the main photo's upload timestamp:
// replacing that photo moves this date. Still an
// ISO date where the market publishes "il y a 6 semaines".
"listedHoursAgo": 1012.56,
// ── Item details add-on β€” the product record's own fields ────────────────
"description": "SΓ©rie limitΓ©e pour l’annΓ©e du cheval.\nTrΓ¨s peu portΓ©e.",
// + Item details β€” the differentiator. Verbatim,
// newlines included, no truncation in the dataset.
"category": "Hommes Vestes coupe-vent",// + Item details β€” the full readable path
"categoryId": 2551, // + Item details β€” the id behind that path
"colors": ["Beige"], // + Item details β€” every colour. The page's own
// structured data carries only the first one.
"attributes": { // + Item details β€” keys vary BY CATEGORY: a book
"catalog": "Vestes coupe-vent", // gives author/isbn, a phone gives battery_health,
"brand": "On Running", // a sofa gives material.
"size": "S",
"status": "Très bon état",
"color": "Beige",
"upload_date": "Il y a 6 semaines"
},
"brandId": 267947, // + Item details β€” Vinted's own brand id
"sizeId": 515, // + Item details
"statusId": 2, // + Item details β€” the condition, as an id
"pickupOnly": false, // + Item details β€” hand-off only, no shipping option
// ── Item details add-on β€” what the same fetch learns about the seller ───
"sellerFeedbackRating": 1, // + Item details β€” 0-1 ratio, a byproduct of
"sellerFeedbackCount": 5, // fetching the product record, not the full profile the
"sellerItemCount": 5, // separate `sellers` dataset below fetches on
"sellerCity": "Courbevoie", // its own opt-in
"sellerCountry": "France", // + Item details
"sellerLastSeenAt": "2026-09-12T13:24:46+02:00", // + Item details
"sellerBadges": ["ACTIVE_LISTER", "SPEEDY_SHIPPING"], // + Item details
// ── Provenance ──────────────────────────────────────────────────────────
"country": "fr",
"scrapedAt": "2026-09-12T13:33:37.732Z",
"detailError": null // the product record arrived; a string
} // here names what stopped it instead

The seller row

With Include seller details on, each unique seller is fetched once and written to a separate sellers dataset β€” not mixed into the listings table, because a seller row has no id, title or price and would read as blank next to your items. Real row from a private seller, fetched on 13 September 2026 β€” 29 of its 36 columns populated, the seven pro-contact columns empty because this seller is not a pro:

{
"sellerId": 295937518,
"sellerLogin": "aliwali786",
"sellerUrl": "https://www.vinted.fr/member/295937518-aliwali786",
"sellerPhoto": "https://images1.vinted.net/t/06_00602_…/f800/1768570494.jpeg?s=9c99d5c1…",
"feedbackReputation": 1, // 0-1 ratio, NOT a 5-star score
"feedbackCount": 24,
"positiveFeedbackCount": 24, // the breakdown behind the ratio: 4.8 from 6 reviews
"neutralFeedbackCount": 0, // is not 4.8 from 600, and only these three say so
"negativeFeedbackCount": 0,
"isEmailVerified": true, // the profile's "verified info"
"isGoogleVerified": true,
"isFacebookVerified": false,
"itemCount": 86, // listed right now
"totalItemsCount": 113, // listed ever
"soldItemCount": 27,
"boughtItemCount": 15,
"sellThroughRate": 23.89, // sold / listed ever, as a percentage
"bundleDiscounts": [ // 5 % off 2 items, 10 % off 3, 30 % off 5
{ "minItems": 2, "percent": 5 },
{ "minItems": 3, "percent": 10 },
{ "minItems": 5, "percent": 30 }
],
"followersCount": 3,
"followingCount": 9,
"followingBrandsCount": 12,
"city": "Lumezzane",
"countryCode": "IT",
"isBusinessSeller": false,
"isOnHoliday": false,
"isOnline": false,
"lastSeenAt": "2026-09-12T21:55:06+02:00", // ISO 8601, not "yesterday at 21:55"
"about": "Beautiful collection for your home, kitchen accessories…",
"businessName": null, // pro sellers only β€” see the example below
"businessEmail": null,
"businessPhone": null,
"businessAddress": null,
"businessCountryCode": null,
"businessLegalCode": null,
"businessRegistrar": null,
"scrapedAt": "2026-09-12T20:23:59.689Z"
}

For a pro seller, those seven columns hold what their public Vinted profile displays. A company that shows everything reads like this (values replaced):

{
"businessName": "Exemple Vintage",
"businessEmail": "contact@example.com",
"businessPhone": "+33100000000",
"businessAddress": "12 rue de la Gare, 75001 Paris, Ile-de-France",
"businessCountryCode": "FR",
"businessLegalCode": "12345678900012",
"businessRegistrar": "RCS Paris"
}

A sole trader shows a city but no street address, so businessAddress stays empty β€” and so does businessEmail or businessPhone whenever Vinted masks it on the profile as a personal contact.

Ready-made views

The Output tab opens on Overview β€” product photo first, then title, brand, size, condition, price and seller. Four more tabs are set up for you, so you rarely need to export before you can read anything:

TabWhat it is for
OverviewPhoto-first browse of everything you collected
Product detailsThe Include item details columns, on their own
Pricing & shippingPrice, buyer fee, total and shipping-from, side by side
Seller & demandWho is selling, and whether the listing is moving
Failed itemsAnything that could not be extracted, with the reason

The Sellers dataset has three of its own: Sellers, Reputation and Activity & reach.


FAQ

Our scrapers are ethical and only collect what Vinted itself displays on a public page. They never return a private seller's email address, phone number or street address. For pro sellers, Include seller details returns the business contact shown on their public Vinted profile β€” the trader details the EU Digital Services Act requires marketplaces to display β€” and nothing Vinted keeps private: a sole trader's personal email or phone stays empty. We therefore believe that our scrapers, used for ethical purposes by Apify users, are safe. However, be aware that your results could contain personal data β€” seller handles, cities, profile text and a sole trader's business contact are public but still personal. Personal data is protected by the GDPR in the European Union and by other regulations worldwide. You should not scrape personal data unless you have a legitimate reason. If you're unsure whether your reason is legitimate, consult your lawyers.

Which Vinted countries are supported?

All 12 live marketplaces: vinted.com, .fr, .de, .es, .it, .be, .at, .cz, .pl, .pt, .ro and .co.uk. One country per run.

Why is viewCount empty on some rows?

Vinted only serves view counts on the seller-wardrobe route, never on catalogue search. Rather than invent a number, the column is null β€” and favouriteCount, which is served everywhere, drives favsPerDay instead.

Can I get more than 813 results?

Yes β€” that's what Deep scan is for. 5,146 unique results measured on a single broad query. See the section above.

How do I monitor prices over time?

Schedule the actor daily from the Schedule tab and let each run append to the same dataset, then diff on id + price. Webhooks can push each finished run straight into your own pipeline.

Something broke, or I need a field you don't have

Open the Issues tab on this actor β€” it's monitored, and feature requests genuinely shape the roadmap. We also build custom variants of this actor for specific pipelines; the Issues tab is the fastest way to start that conversation.