# Vinted Scraper — EU Second-Hand Products & Prices (`haketa/vinted-scraper`) Actor

Scrape Vinted, Europe largest second-hand fashion marketplace. Extract products with price, brand, size, condition, seller info and images. Search by keyword across all EU markets. Pure HTTP, no proxy required.

- **URL**: https://apify.com/haketa/vinted-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Lead generation
- **Features:** Limited permissions
- **Stats:** 9 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Vinted Scraper — EU & US Second-Hand Fashion Products, Prices, Brands & Sellers

> **Scrape [Vinted](https://www.vinted.com), Europe's largest second-hand fashion marketplace, and turn any keyword or catalog URL into clean, structured e-commerce data.** Extract **product title, price, buyer-protection price, currency, brand, size, condition, favourites count, images, and seller reputation** across **23 Vinted country marketplaces** — with no login and no coding.
>
> Export to **JSON, CSV, Excel, or API** for resale arbitrage, price benchmarking, circular-fashion analytics, and catalog intelligence.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00C853?logo=apify\&logoColor=white)](https://apify.com/haketa/vinted-scraper)
[![Marketplaces](https://img.shields.io/badge/Vinted-23%20Country%20Domains-09B1BA)]()
[![Listings](https://img.shields.io/badge/Data-Prices%20%7C%20Brands%20%7C%20Sizes%20%7C%20Sellers-007ec6)]()
[![Scale](https://img.shields.io/badge/Scale-1%2C000%2B%20Listings%20Pagination-8A2BE2)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-fb8500)]()

> **Built for** resellers and vintage flippers hunting underpriced inventory, fashion brands and pricing analysts tracking circular-economy resale values, e-commerce intelligence teams benchmarking second-hand supply, and market researchers studying European recommerce trends.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Supported Marketplaces** | **23 Vinted domains**: `.com` (US/Intl), `.de`, `.fr`, `.co.uk`, `.es`, `.it`, `.nl`, `.be`, `.pl`, `.cz`, `.at`, `.lt`, `.pt`, `.sk`, `.lu`, `.ro`, `.se`, `.fi`, `.dk`, `.hu`, `.gr`, `.ie`, `.hr` |
| **Search Modes** | Keyword search (`query`), country marketplace (`domain`), or filtered catalog URLs (`startUrls`) |
| **Page Density & Scale** | ~96 listings per catalog page — automatic pagination (`maxPages: 0`) scales cleanly to **1,000+ products per run** |
| **Fast Catalog Mode** | Default `includeDetails: false` extracts 100 listings in ~15–25s (400+ listings in <60s) |
| **Deep Detail Mode** | Optional `includeDetails: true` adds full description, up to 20 high-res gallery photos, seller username, rating, review count, and pro-seller flag |
| **De-duplication** | Automatic `productId` de-duplication across all pages and search terms (`0 duplicates`) |
| **Empty-Run Behavior** | Automatically samples 10 popular fashion categories/brands when run with an empty query |
| **Export Formats** | JSON, CSV, Excel (XLSX), HTML, XML, RSS, and Apify API |

***

### 🔎 Why scrape Vinted?

[Vinted](https://www.vinted.com) is the dominant **second-hand fashion and lifestyle marketplace** across Europe and a rapidly growing platform in the US and UK, hosting over **100 million active listings** across 23 regional domains. Every listing carries granular structured metadata — **brand, size, condition tier, item price, buyer-protection total price, favourite count, and photos** — making Vinted the richest live dataset for circular fashion, resale pricing, and brand demand.

However, Vinted offers **no public API**, inventory turns over by the minute, and prices vary substantially between countries (e.g., `vinted.fr` vs. `vinted.de` vs. `vinted.pl`). Manually browsing pages or copying listings into spreadsheets cannot keep pace. This **Vinted scraper** automates session initialization, steps through ~96-item catalog pages automatically, de-duplicates every listing by `productId`, and outputs analysis-ready records in seconds.

#### Common reasons teams use this Vinted data extractor:

- 💸 **Resale arbitrage & deal sourcing** — spot underpriced Nike, Zara, Levi's, Arc'teryx, Carhartt, and luxury vintage pieces as soon as they hit the catalog (`newest_first`).
- 📊 **Brand & resale price benchmarking** — calculate median asking prices by brand, condition (`New with tags` vs. `Very good` vs. `Good`), and size across 23 countries.
- 🌍 **Cross-border marketplace comparison** — compare supply and pricing for the same brand across France, Germany, Spain, Italy, Poland, the UK, and the US.
- 🧑‍💼 **Professional seller & competitor intelligence** — enable detail enrichment to identify high-volume sellers, professional business accounts (`sellerBusiness`), and review counts.
- 📈 **Trend & demand forecasting** — track `favouriteCount` velocity and listing volume across styles, seasons, and categories.
- ♻️ **Circular-fashion & sustainability research** — quantify second-hand market depth, brand resale retention, and clothing lifecycle metrics.

***

### ✨ What this Vinted scraper does

- ✅ **Keyword search (`query`)** — search any brand, garment type, or style (`nike`, `zara`, `levis 501`, `linen dress`, `leather handbag`, `vintage jacket`).
- ✅ **23-country marketplace selector (`domain`)** — switch between `vinted.com`, `vinted.de`, `vinted.fr`, `vinted.co.uk`, `vinted.es`, `vinted.it`, `vinted.nl`, `vinted.pl`, and 15 more local domains with automatic currency detection (`EUR`, `USD`, `GBP`, `PLN`, `CZK`, `HUF`, `RON`, `SEK`).
- ✅ **Advanced Start URLs (`startUrls`)** — paste any filtered Vinted catalog URL (pre-filtered on Vinted by brand ID, size, color, condition, or price range) and the scraper preserves every URL filter while paginating.
- ✅ **Unlocked 1,000+ deep pagination** — with `maxPages: 0` (default), pagination automatically advances through catalog pages (~96 listings per page) until your `maxItems` limit is reached or the catalog ends.
- ✅ **Complete catalog card extraction** — captures `productId`, `title`, `url`, `price`, `priceFormatted`, `currency`, `originalPrice` (total with buyer-protection fee), `brand`, `size`, `condition`, `favouriteCount`, and `imageUrl` straight from the catalog without slow per-item requests.
- ✅ **Optional item-page enrichment (`includeDetails`)** — visits each product page in parallel batches (`maxConcurrency`) to extract the full `description`, up to 20 deduplicated full-size `images`, `sellerName`, `sellerUrl`, `sellerRating`, `sellerReviews`, and `sellerBusiness`.
- ✅ **Built-in multi-category sample on empty runs** — running with `{}` automatically samples 10 popular fashion queries (`nike`, `zara`, `adidas`, `levis`, `dress`, `sneakers`, `handbag`, `jacket`, `vintage`, `north face`) so you get a balanced dataset immediately.

***

### 🎯 Use cases & B2B workflows

#### 1. Vintage Resellers & Arbitrage Automation

Schedule frequent runs ordered by `newest_first` (the default catalog sort) for target brands or filtered `startUrls`. Pipe the output to a webhook, Telegram/Slack bot, or Google Sheet to alert your sourcing team whenever high-margin items appear below your target price threshold.

#### 2. Fashion Brands & Dynamic Pricing Engines

Resale platforms, consignment stores, and apparel brands need accurate second-hand price curves. Pull 1,000+ listings per brand to compute average and percentile prices segmented by `condition` (`New with tags`, `Very good`, `Good`) and `size`.

#### 3. European Recommerce Market Research

Compare listing density and price dispersion across 23 European and international Vinted domains. Because the scraper normalizes `price` (numeric string), `priceFormatted`, and ISO `currency`, cross-country price comparisons require zero manual cleanup.

#### 4. Pro-Seller & Consignment Lead Generation

Enable `includeDetails: true` to surface professional vintage boutiques and registered business sellers (`sellerBusiness: "true"`), complete with their `sellerName`, `sellerUrl`, `sellerRating`, and `sellerReviews` volume.

***

### 🌍 Supported Vinted marketplaces & currencies (23 domains)

| Country / Region | `domain` Value | Base Hostname | Local Currency |
|---|---|---|---|
| **United States / International** | `com` | `www.vinted.com` | `USD` (`$`) |
| **Germany** | `de` | `www.vinted.de` | `EUR` (`€`) |
| **France** | `fr` | `www.vinted.fr` | `EUR` (`€`) |
| **United Kingdom** | `co.uk` | `www.vinted.co.uk` | `GBP` (`£`) |
| **Spain** | `es` | `www.vinted.es` | `EUR` (`€`) |
| **Italy** | `it` | `www.vinted.it` | `EUR` (`€`) |
| **Netherlands** | `nl` | `www.vinted.nl` | `EUR` (`€`) |
| **Belgium** | `be` | `www.vinted.be` | `EUR` (`€`) |
| **Poland** | `pl` | `www.vinted.pl` | `PLN` (`zł`) |
| **Czechia** | `cz` | `www.vinted.cz` | `CZK` (`Kč`) |
| **Austria** | `at` | `www.vinted.at` | `EUR` (`€`) |
| **Portugal** | `pt` | `www.vinted.pt` | `EUR` (`€`) |
| **Lithuania** | `lt` | `www.vinted.lt` | `EUR` (`€`) |
| **Sweden** | `se` | `www.vinted.se` | `SEK` (`kr`) |
| **Denmark / Finland / Slovakia / Luxembourg / Romania / Hungary / Greece / Ireland / Croatia** | `dk`, `fi`, `sk`, `lu`, `ro`, `hu`, `gr`, `ie`, `hr` | `www.vinted.<domain>` | Local (`EUR`, `HUF`, `RON`, `DKK`) |

***

### 📥 Input configuration

All fields are optional (`required: []`). Use `query` + `domain` for quick searches, or `startUrls` for complex multi-filter catalog sweeps.

| Parameter | Type | Default / Prefill | Description |
|---|---|---|---|
| `query` | `string` | Prefill: `"nike"` | Search keyword (e.g., `nike`, `zara`, `levis`, `dress`, `sneakers`). Leave empty to collect a mixed sample across 10 popular fashion terms. |
| `domain` | `string` | `"com"` | Vinted country marketplace to search (`com`, `de`, `fr`, `co.uk`, `es`, `it`, `nl`, `be`, `pl`, `cz`, `at`, `lt`, `pt`, `sk`, `lu`, `ro`, `se`, `fi`, `dk`, `hu`, `gr`, `ie`, `hr`). Ignored when `startUrls` are set. |
| `startUrls` | `array` | `[]` | Optional Vinted catalog/search URLs (e.g., filtered by brand, size, or price ceiling). Takes priority over `query` and `domain`. |
| `includeDetails` | `boolean` | `false` | Open each listing page to extract `description`, full `images` gallery, and seller profile/rating metrics. Keep `false` for fast catalog sweeps. |
| `maxItems` | `integer` | `100` | Maximum number of products to collect (`0` = unlimited). Raise to `1000`+ for deep catalog harvesting. |
| `maxPages` | `integer` | `0` | Maximum catalog pages to read per search (~96 listings per page). `0` = automatic pagination governed by `maxItems`. |
| `requestDelay` | `integer` | `500` | Pause in milliseconds between detail-page requests when `includeDetails: true` (`0`–`5000`). |
| `maxConcurrency` | `integer` | `6` | Number of parallel detail-page requests (`1`–`12`) when `includeDetails: true`. |
| `proxyConfiguration` | `object` | Apify Residential | Proxy settings. Apify Residential proxy is enabled by default for reliable session handling. |

#### Example 1 — Fast 1,000+ listing brand sweep (list mode)

```json
{
  "query": "nike",
  "domain": "fr",
  "includeDetails": false,
  "maxItems": 1000,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Example 2 — Filtered catalog URLs with price cap & brand filter

```json
{
  "startUrls": [
    { "url": "https://www.vinted.de/catalog?search_text=levis&brand_ids[]=7&price_to=40&order=newest_first" },
    { "url": "https://www.vinted.de/catalog?search_text=carhartt&price_to=60&order=newest_first" }
  ],
  "includeDetails": false,
  "maxItems": 500,
  "maxPages": 0
}
```

#### Example 3 — Deep product & seller enrichment (`includeDetails: true`)

```json
{
  "query": "arcteryx jacket",
  "domain": "co.uk",
  "includeDetails": true,
  "maxItems": 50,
  "maxConcurrency": 6,
  "requestDelay": 400
}
```

***

### 📤 Output schema & field reference

Every Vinted listing is saved as a flat, normalized JSON object. Below is a real record from a fast catalog run (`includeDetails: false`):

```json
{
  "productId": "10629921633",
  "title": "Nike sports bra",
  "url": "https://www.vinted.com/items/10629921633-nike-sports-bra",
  "price": "3.00",
  "priceFormatted": "$3.00",
  "currency": "USD",
  "originalPrice": "3.85",
  "brand": "Nike",
  "size": "XL",
  "condition": "Good",
  "favouriteCount": "1",
  "viewCount": null,
  "sellerName": null,
  "sellerUrl": null,
  "sellerBusiness": null,
  "sellerRating": null,
  "sellerReviews": null,
  "imageUrl": "https://images1.vinted.net/t/06_01d8d_mpjEgR2GCrmQr4MR9FG8UbuP/310x430/b86a2645.webp",
  "images": null,
  "description": null,
  "searchQuery": "nike",
  "scrapedAt": "2026-11-10T02:50:00.000Z"
}
```

When `includeDetails: true` is enabled, the enrichment fields are populated:

```json
{
  "sellerName": "fashion_finds_us",
  "sellerUrl": "https://www.vinted.com/member/3183294676",
  "sellerBusiness": "false",
  "sellerRating": "5.00",
  "sellerReviews": "27",
  "images": "[\"https://images1.vinted.net/.../photo1.webp\",\"https://images1.vinted.net/.../photo2.webp\"]",
  "description": "Worn a few times, still in great condition. No stains or tears."
}
```

#### 🏷️ Product Identity & Pricing

| Field | Type | Coverage | Description |
|---|---|---|---|
| `productId` | `string` | 🟢 High (100%) | Unique Vinted item ID used for de-duplication across pages and searches. |
| `title` | `string` | 🟢 High (100%) | Listing title as written by the seller. |
| `url` | `string` | 🟢 High (100%) | Canonical URL to the product page on the target Vinted domain. |
| `price` | `string` | 🟢 High (100%) | Numeric item price (dot-decimal string, e.g., `"25.00"`). |
| `priceFormatted` | `string` | 🟢 High (100%) | Display price with local currency symbol (e.g., `"$25.00"`, `"25,00 €"`, `"£18.00"`). |
| `currency` | `string` | 🟢 High (100%) | ISO 4217 currency code (`EUR`, `USD`, `GBP`, `PLN`, `CZK`, `HUF`, `RON`, `SEK`). |
| `originalPrice` | `string\|null` | 🟢 High (~98%) | Total buyer-protection price displayed alongside the base item price. |

#### 👕 Attributes, Engagement & Media

| Field | Type | Coverage | Description |
|---|---|---|---|
| `brand` | `string\|null` | 🟢 High (~98%) | Brand label declared on the listing (e.g., `Nike`, `Zara`, `Levi's`). |
| `size` | `string\|null` | 🟢 High (~95%) | Size label (`S`, `M`, `L`, `EU 38`, `W32`). `null` on sizeless items like bags or accessories. |
| `condition` | `string\|null` | 🟢 High (100%) | Condition tier (`New with tags`, `New without tags`, `Very good`, `Good`, `Satisfactory`). |
| `favouriteCount` | `string\|null` | 🟡 Conditional | Number of user likes/favourites when displayed on the listing tile. |
| `imageUrl` | `string\|null` | 🟢 High (100%) | Primary product thumbnail/image URL. |
| `images` | `string\|null` | 🟡 Detail Mode | JSON-encoded array of up to 20 deduplicated full-resolution photo URLs (`includeDetails: true`). |
| `description` | `string\|null` | 🟡 Detail Mode | Full seller description up to 3,000 characters (`includeDetails: true`). |

#### 🧑‍💼 Seller Profile & Run Metadata

| Field | Type | Coverage | Description |
|---|---|---|---|
| `sellerName` | `string\|null` | 🟡 Detail Mode | Seller username (`includeDetails: true`). |
| `sellerUrl` | `string\|null` | 🟡 Detail Mode | Direct URL to the seller's Vinted member profile (`includeDetails: true`). |
| `sellerBusiness` | `string\|null` | 🟡 Detail Mode | `"true"` if the seller is a registered Pro/business account, else `"false"` (`includeDetails: true`). |
| `sellerRating` | `string\|null` | 🟡 Detail Mode | Seller star rating normalized to a `0.00`–`5.00` scale (`includeDetails: true`). |
| `sellerReviews` | `string\|null` | 🟡 Detail Mode | Total number of seller feedback reviews (`includeDetails: true`). |
| `viewCount` | `string\|null` | 🟡 Conditional | Item view count when exposed by the page. |
| `searchQuery` | `string\|null` | 🟢 High (100%) | Search keyword or tag that produced this listing. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO 8601 UTC timestamp of extraction. |

***

### 🔁 Pagination, scale & 1,000+ listing sweeps

Each Vinted catalog page renders **up to 96 listings**. With `maxPages: 0` (the default), the scraper automatically calculates and follows pagination links (`?page=2`, `?page=3`, …) until it collects your exact `maxItems` target or reaches the end of the catalog:

- **Quick 100-item prefill**: Reads ~2 catalog pages and finishes in **~15–25 seconds**.
- **1,000+ listing harvest**: Setting `maxItems: 1000` (with `maxPages: 0` and `includeDetails: false`) paginates through ~11 catalog pages and extracts **1,000 unique products in ~1.5–2 minutes**.
- **Strict de-duplication**: Because new items are constantly added to Vinted (`newest_first`), listings can shift between page N and page N+1. The scraper tracks every `productId` in an in-memory `Set` so shifted items are never pushed twice.

***

### ⚙️ How to use

1. **Open the Actor** in the Apify Console.
2. **Choose your search**: enter a `query` (e.g., `nike`) and select a `domain` (e.g., `de`, `fr`, `com`), or paste filtered catalog URLs into `startUrls`.
3. **Configure volume & depth**: set `maxItems` (e.g., `100`, `500`, `1000+`) and leave `maxPages: 0` for automatic pagination. Toggle `includeDetails: true` only when you need seller ratings and full descriptions.
4. **Click Start** and watch products populate the dataset.
5. **Export or automate**: download as **JSON, CSV, or Excel**, or connect the run to Google Sheets, Make, Zapier, n8n, or your pricing database via the Apify API.

#### API Example (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/vinted-scraper").call(run_input={
    "query": "nike",
    "domain": "de",
    "includeDetails": False,
    "maxItems": 1000,
    "maxPages": 0,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} | {item['priceFormatted']} | {item['brand']} | {item['size']} | {item['condition']}")
```

#### API Example (Node.js)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/vinted-scraper').call({
    query: 'zara dress',
    domain: 'fr',
    includeDetails: false,
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} Vinted listings`);
```

#### API Example (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~vinted-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "levis 501",
    "domain": "de",
    "includeDetails": false,
    "maxItems": 500,
    "maxPages": 0
  }'
```

***

### 🔄 Automation & integration workflows

- **Google Sheets / Excel Price Dashboards**: Export `title`, `brand`, `size`, `condition`, `price`, `originalPrice`, and `currency` directly to a spreadsheet to calculate resale price benchmarks.
- **Make.com / Zapier / n8n Deal Alerts**: Schedule the actor every 15–60 minutes on your filtered `startUrls` and push new `productId` items to Slack, Discord, Telegram, or email.
- **BigQuery / PostgreSQL / Snowflake**: Stream thousands of European second-hand fashion records into your warehouse to track brand supply and recommerce velocity over time.

***

### 💡 Pro tips for best results

- **Use list mode (`includeDetails: false`) for high-volume price monitoring**: Catalog cards already carry `title`, `price`, `originalPrice`, `currency`, `brand`, `size`, `condition`, `favouriteCount`, and `imageUrl` — so you get 90% of analytics fields at ~20× the speed and a fraction of the proxy transfer cost.
- **Filter on Vinted first, then paste into `startUrls`**: Need a specific brand ID, size ID, color, and price ceiling? Apply those filters in your browser on Vinted, copy the URL from the address bar, and paste it into `startUrls`.
- **Match `startUrls` domain automatically**: When you provide a `vinted.fr` or `vinted.pl` URL in `startUrls`, the scraper automatically detects the hostname and warms cookies on that specific country domain.

***

### ⚠️ Honest limitations

- **Detail mode speed**: Enabling `includeDetails: true` fetches each product's HTML page individually. Keep `maxItems` moderate (e.g., 50–250) when enrichment is enabled so runs finish quickly and residential proxy bandwidth stays low.
- **Sizeless items**: Accessories, bags, books, and homeware on Vinted often omit a size tag; for those items `size` is accurately returned as `null`.
- **Residential proxy required**: Vinted blocks datacenter IP ranges; keep the default Apify Residential proxy enabled.

***

### ❓ FAQ

#### Does Vinted have an official public API?

No. Vinted does not provide a public API for searching listings or pricing data. This actor turns any Vinted search or catalog URL into a clean JSON/CSV API.

#### Do I need a Vinted account or login cookies?

No. The actor warms an anonymous browsing session automatically — you never need to supply credentials or personal cookies.

#### How many products can I scrape in one run?

With `maxPages: 0` (auto), pagination scales to **1,000+ products per run** governed by your `maxItems` setting. You can also combine multiple `startUrls` to harvest several thousand listings across categories or brands.

#### Which Vinted countries and currencies are supported?

All **23 Vinted domains**: `com` (USD), `co.uk` (GBP), `pl` (PLN), `cz` (CZK), `hu` (HUF), `ro` (RON), `se` (SEK), `dk`, and eurozone markets (`de`, `fr`, `es`, `it`, `nl`, `be`, `at`, `lt`, `pt`, `sk`, `lu`, `fi`, `gr`, `ie`, `hr` — EUR).

#### Why are `sellerName` and `description` null by default?

Vinted only serves seller usernames, ratings, full descriptions, and secondary gallery photos on individual item pages. Enable `includeDetails: true` in the input whenever you need those fields.

***

### 🔗 Related scrapers

Explore other e-commerce and marketplace scrapers by **haketa**:

- [OfferUp Scraper](https://apify.com/haketa/offerup-scraper) — US local resale marketplace listings, prices, and seller profiles.
- [Mercari Scraper](https://apify.com/haketa/mercari-scraper) — Second-hand marketplace products, brands, and pricing data.
- [Woolworths Scraper](https://apify.com/haketa/woolworths-scraper) — Retail product catalog, pricing, and promotion monitoring.
- [IndiaMART Scraper](https://apify.com/haketa/indiamart-scraper) — B2B wholesale product and supplier intelligence.

***

### 📋 Changelog

#### v1.2 (2026-11)

- **Unlocked 1,000+ Automatic Pagination**: Changed `maxPages` default to `0` (auto/unlimited governed by `maxItems`) and fixed `maxPages: 0` handling so 1,000+ product runs paginate seamlessly across 10+ catalog pages.
- **De-duplication & Slice Accuracy**: Improved per-page candidate slicing so mixed-sample and multi-page runs preserve every unique `productId` without premature seen-set marking.
- **Documentation Upgrade**: Added 23-country marketplace coverage table, field coverage indicators, and bulk API examples.

#### v1.1 (2026-10)

- Added sizeless item price-tail parser so bags and accessories retain `price`, `originalPrice`, and `currency`.
- Added automatic session re-warming on HTTP 401/403 responses.

#### v1.0 (2026-09)

- Initial release supporting 23 Vinted country domains, keyword and `startUrls` catalog scraping, and optional item-page enrichment.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/vinted-scraper/changelog.md

# Actor input Schema

## `query` (type: `string`):

What to search for on Vinted, e.g. nike, zara, levis, dress, sneakers, handbag. Leave this empty to get a ready-made mixed sample of popular listings across several categories.

## `domain` (type: `string`):

Which Vinted country site to search (ignored if Start URLs are provided).

## `startUrls` (type: `array`):

Power users only: paste any Vinted catalog or search page URLs you already have (e.g. a page filtered by brand or size). When set, these take priority over the keyword and marketplace above. Most users can ignore this and just use the search box.

## `includeDetails` (type: `boolean`):

Also open each listing to add the full description and the seller's rating and number of reviews. Gives richer data but runs slower.

## `maxItems` (type: `integer`):

Stop after this many products so runs stay fast and predictable. Set 0 for no limit.

## `maxPages` (type: `integer`):

Maximum result pages to read per keyword (about 96 listings each). Set 0 for automatic pagination governed by maxItems.

## `requestDelay` (type: `integer`):

Optional pause between detail-page requests. Higher values are gentler; the default works well.

## `maxConcurrency` (type: `integer`):

Optional: how many detail pages to fetch at once. Leave as-is unless you know you need to change it.

## `proxyConfiguration` (type: `object`):

Proxy used for the run. The default (Apify Residential) is recommended for the most reliable results.

## Actor input object example

```json
{
  "query": "nike",
  "domain": "com",
  "startUrls": [],
  "includeDetails": false,
  "maxItems": 100,
  "maxPages": 0,
  "requestDelay": 500,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted Vinted product listings for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table of the scraped products.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "nike",
    "domain": "com",
    "startUrls": [],
    "maxItems": 100,
    "requestDelay": 500,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/vinted-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "nike",
    "domain": "com",
    "startUrls": [],
    "maxItems": 100,
    "requestDelay": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/vinted-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "nike",
  "domain": "com",
  "startUrls": [],
  "maxItems": 100,
  "requestDelay": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call haketa/vinted-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/vinted-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7UaUWPd23CkXssqtU/builds/sa2RnmfGxGS04SZHt/openapi.json
