# Vinted Scraper (`lergassy/vinted-scraper`) Actor

Scrape Vinted listings from 24 countries by keyword, filters or any Vinted URL: title, price with fees, brand, size, condition, photos, favourites and seller. Add description, category, upload time and seller rating. Monitor new items, export JSON/CSV, use the API or schedule runs.

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

## Pricing

from $0.53 / 1,000 items

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

### What is Vinted Scraper?

**Vinted Scraper** extracts second-hand listings from [Vinted](https://www.vinted.com) in **24 countries** — France, Germany, Italy, Spain, the UK, the US, Poland, the Netherlands, Belgium, Austria, Portugal, Czechia, Lithuania, Slovakia, Sweden, Denmark, Finland, Romania, Hungary, Ireland, Luxembourg, Croatia, Greece and Slovenia. Type a search such as `nike air max`, paste any Vinted search, category, brand, seller or item link, and get every listing as clean rows: **title, price as a number, buyer protection fee, total price, brand, size, condition, photo, favourites and seller**.

Turn on **item details** to also get the **full description, all photos, colour, category path, upload time and the seller's rating, review count, country, city and sales**. Turn on the **monitor mode** and schedule the Actor to receive only the items listed since the last run — the classic reseller workflow for catching underpriced pieces first.

No Vinted account, no login, no cookies to copy. Export to JSON, CSV or Excel, call it from the API, or plug it into n8n, Make, Zapier and Google Sheets.

### What data can it extract?

| Field | Example | When |
|---|---|---|
| `title`, `url`, `id` | "pantalon", link, 10491717625 | always |
| `price`, `currency` | 15, "EUR" | always |
| `serviceFee`, `totalPrice` | 1.45, 16.45 | search and seller rows |
| `brand`, `size` | "Zara", "M" | always (when the seller set them) |
| `condition`, `conditionLocal` | "Very good", "Très bon état" | always |
| `photo`, `favouriteCount`, `isPromoted` | photo URL, 0, false | always |
| `sellerId`, `sellerLogin`, `sellerUrl`, `sellerIsBusiness` | 66082671, "jules-frz" | always |
| `photos`, `photoCount` | all photo URLs, 4 | item details, seller rows |
| `description`, `color`, `attributes` | seller's text, "Bleu clair", material | item details |
| `category`, `categoryPath`, `catalogId` | "Jeans coupe droite" | item details |
| `uploadedAt`, `uploadedAgo` | 2026-10-23T00:24:54Z, "A l'instant" | item details, seller rows |
| `isReserved`, `availability` | false, "InStock" | item details |
| `sellerRating`, `sellerReviewCount`, `sellerPositiveReviews`, `sellerNegativeReviews` | 3.6, 13, 8, 4 | item details, seller rows |
| `sellerCountry`, `sellerCity`, `sellerItemCount`, `sellerSoldCount`, `sellerFollowers`, `sellerLastSeenAt` | "FR", 2, 9 | item details, seller rows |
| `note` | "Details unavailable right now — not charged." | only when details could not be read |
| `searchQuery`, `sourceUrl`, `country`, `domain`, `position`, `page`, `scrapedAt` | "jeans", "be", 2 | always |

Prices are in the Vinted site's own currency (EUR, GBP, USD, PLN, CZK, SEK, DKK, RON, HUF). `condition` is always in English so you can filter across countries; the local wording stays in `conditionLocal`.

### How much does it cost to scrape Vinted?

Pay per event — you pay only for items delivered, no start fee:

| Plan | Price per item | Items per $1 | Item details add-on |
|---|---|---|---|
| Free | $0.0021 | ~476 | +$0.0007 per detailed item |
| Bronze | $0.0014 | ~714 | +$0.0007 per item |
| Silver | $0.00105 | ~952 | +$0.0007 per item |
| Gold, Platinum, Diamond | $0.000525 | ~1,900 | +$0.0007 per item |

The details add-on is charged only for items whose page was actually read. Item pages are read only over regular routes; when Vinted is busy for an item, its row keeps the search data, gets `note: "Details unavailable right now — not charged."` and the add-on is not charged. The Apify free plan includes $5 of monthly credit — about 2,300 Vinted items on the Free tier. Error rows, "no results" rows and the summary row are free. Set **Max cost per run** and the Actor stops cleanly at that amount with every written row paid for. In monitor mode items you already received are skipped and not charged.

### How to scrape Vinted

1. Open the Actor and type one or more **search queries** (or paste Vinted links into **Start URLs**).
2. Pick the **Vinted country** — prices come in its currency.
3. Optional: set price range, brands, sizes, condition, category and sort order.
4. Optional: tick **Include item details** for descriptions, all photos and seller ratings.
5. Click **Start**. A 50-item search takes a few seconds; download the data as JSON, CSV or Excel.

### ⬇️ Input

```json
{
    "searchQueries": ["nike air max", "carhartt jacket"],
    "country": "fr",
    "maxItems": 100,
    "sort": "newest",
    "minPrice": 10,
    "maxPrice": 80,
    "brands": ["Nike", "Carhartt WIP"],
    "condition": ["new_with_tags", "very_good"],
    "includeDetails": false,
    "onlyNewItemsStore": "my-vinted-watch"
}
```

Start URLs work for searches with filters (`/catalog?search_text=…&brand_ids[]=53&status_ids[]=6`), categories (`/catalog/1904-women`), brands (`/brand/53-nike`), sellers (`/member/66082671-name` — the whole wardrobe) and single items (`/items/10491717625-…` — always with details). With an empty input the Actor runs a short demo search for `nike`.

### ⬆️ Output

A real row (item details on, vinted.be):

```json
{
  "type": "item",
  "id": 10491717625,
  "url": "https://www.vinted.be/items/10491717625-pantalon",
  "title": "pantalon",
  "price": 15,
  "currency": "EUR",
  "serviceFee": 1.45,
  "totalPrice": 16.45,
  "brand": "Zara",
  "brandId": 12,
  "size": "M",
  "condition": "Very good",
  "conditionLocal": "Très bon état",
  "color": "Bleu clair",
  "category": "Jeans coupe droite",
  "categoryPath": ["Hommes", "Vêtements", "Jeans", "Jeans coupe droite"],
  "catalogId": 1819,
  "photo": "https://images1.vinted.net/tc/02_01a25_3m5GmSXeucjEUjEw3ejq3nAG/2b3aa980.webp?s=65941f8f95307f5811f0578f757fa59fc96bcce8",
  "photoCount": 4,
  "favouriteCount": 0,
  "isPromoted": false,
  "isReserved": false,
  "uploadedAt": "2026-10-23T00:24:54.484Z",
  "uploadedAgo": "A l'instant",
  "description": "article en bon état ✅",
  "sellerId": 66082671,
  "sellerLogin": "jules-frz",
  "sellerRating": 3.6,
  "sellerReviewCount": 13,
  "sellerCountry": "FR",
  "sellerSoldCount": 9,
  "sellerLastSeenAt": "2026-10-23T00:22:07.000Z",
  "searchQuery": "jeans",
  "country": "be",
  "position": 2,
  "scrapedAt": "2026-10-23T00:26:26.999Z"
}
```

### Use cases

#### Resellers and flippers

Schedule a search every 15 minutes with **Only new items** and sort by newest: you get a feed of fresh listings for your brands and sizes before other buyers see them.

#### Price research and arbitrage

Run the same query on several Vinted countries and compare `price` and `totalPrice` per brand, size and condition — the same item often costs less in one market.

#### Brands and second-hand market analysts

Track how many listings a brand has, in which condition and at which prices; follow favourites as a demand signal.

#### Seller and competitor monitoring

Paste a seller's profile URL to export their whole wardrobe with photos, upload dates and their rating.

#### AI agents

One call returns flat, typed JSON with English condition labels and numeric prices — easy for an LLM agent to filter, compare and summarise. Use it through the Apify API or the Apify MCP server.

### Integrations

- **API**: start runs and read the dataset with the [Apify API](https://docs.apify.com/api/v2) or the official Python and JavaScript clients (`apify-client`).
- **No-code**: n8n, Make, Zapier and Google Sheets integrations send new Vinted items wherever you work.
- **Schedules and webhooks**: run every few minutes and get a webhook when new items arrive.
- **MCP**: AI assistants can call the Actor as a tool through `mcp.apify.com`.

### Migrating from another Vinted scraper?

| Other scrapers | Vinted Scraper |
|---|---|
| `keywords`, `query`, `search` | `searchQueries` |
| `startUrls`, `itemUrls`, `sellerUrls` | `startUrls` (all link types in one list) |
| `market`, `country`, `domain` | `country` |
| `price_from` / `priceMin`, `price_to` / `priceMax` | `minPrice`, `maxPrice` |
| `brand_ids`, `brandIds` | `brands` (names or ids) |
| `size_ids`, `sizeIds` | `sizes` (labels like "M", "42" or ids) |
| `status_ids`, `condition` | `condition` |
| `order`, `sortBy` | `sort` |
| `maxProducts`, `max_results`, `maxItems` | `maxItems` (per search) |

### Troubleshooting

- **Fewer items than `maxItems`**: Vinted itself has no more matches for the filters — loosen them. One Vinted search stops at 960 results; for more the Actor re-reads it in other sort orders.
- **A brand or size is ignored**: check the log — names Vinted does not know are reported and the search is skipped with a free row rather than returning unfiltered items.
- **Item details are slower**: every item page is opened (about 1 second per item at 10 in parallel). Leave details off when you only need prices.
- **A row has a `note` and no description**: Vinted refused or rate-limited that item page for long — the row keeps its search data and the details add-on was not charged. Run it again later or with fewer parallel item pages.
- **A note says the item is gone**: it was sold or deleted between the search and the item page (details not charged).

### ❓ FAQ

#### Is it legal to scrape Vinted?

The Actor reads only public listing data that anyone can see without an account. Seller usernames are personal data in the EU: process them under GDPR and Vinted's terms, and only for a legitimate purpose. When in doubt, ask a lawyer.

#### Do I need a Vinted account or proxies?

No. The Actor opens an anonymous session itself and steps up to residential or unblocking routes only when Vinted refuses a request.

#### Which countries are supported?

All 24 Vinted sites: pick one of 20 in the Country field, or paste a link from any Vinted domain into Start URLs.

#### How exact is `uploadedAt`?

On seller rows it comes from the photo upload timestamps. With item details it is computed from Vinted's "uploaded N hours ago" text, so it is exact to the unit Vinted shows.

#### Can I get only new listings?

Yes — give **Only new items** a name and schedule the Actor. Each run returns and charges only the newest items it has not delivered before.

### Your feedback

Found a bug or missing a field? Open an issue on the Actor's **Issues** tab — we read every report and fix fast.

### You might also like

| Actor | What it does |
|---|---|
| [Kleinanzeigen Scraper](https://apify.com/lergassy/kleinanzeigen-scraper) | Listings, prices and sellers from Kleinanzeigen.de |
| [Shopee Scraper](https://apify.com/lergassy/shopee-scraper) | Shopee products, prices, shops and ratings |
| [Mercado Libre Products Scraper](https://apify.com/lergassy/mercadolibre-products-scraper) | Mercado Libre products, prices and sellers |

# Actor input Schema

## `searchQueries` (type: `array`):

Give this or `Start URLs`. What you would type in the Vinted search box, one per line: e.g. "nike air max", "levis 501", "carhartt jacket". Each query is searched on the Vinted country chosen below and returns up to `Max items per search` listings.

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

Give this or `Search queries`. Any Vinted link from any country: a search or catalogue page with filters (https://www.vinted.fr/catalog?search_text=…\&brand_ids\[]=53), a category (/catalog/1904-women), a brand (/brand/53-nike), a seller profile (/member/123456-name — all their listings) or a single item (/items/123456-title — always with details). The domain of the link decides the country.

## `country` (type: `string`):

Which Vinted site the search queries run on. Prices come in that site's currency (EUR, GBP, USD, PLN, CZK…). Start URLs keep their own domain.

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

Maximum listings per search query or start URL. Vinted shows at most 960 results per search; above that the Actor reads the same search in other sort orders to reach more distinct items.

## `sort` (type: `string`):

Order of results. "Newest first" is what resellers use to catch fresh listings; combine it with the monitor mode below.

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

Opens every item page: full description, all photos, colour, category path, upload time, reserved flag, and the seller's rating, review count, country, city, items for sale and last login. Billed as the add-on event "Item details" on top of the item price, only for items whose page was actually read; if Vinted is busy the row keeps its search data, gets a note and the add-on is not charged.

## `onlyNewItemsStore` (type: `string`):

Monitor mode. Give any name (e.g. "my-nike-watch"). The Actor remembers every item it delivered under that name and on later runs returns — and charges — only items it has not delivered before. Schedule the Actor every 10–60 minutes to get a feed of fresh listings.

## `minPrice` (type: `number`):

Lowest item price, in the Vinted site's currency (before the buyer protection fee).

## `maxPrice` (type: `number`):

Highest item price, in the Vinted site's currency (before the buyer protection fee).

## `brands` (type: `array`):

Brand names as on Vinted ("Nike", "Ralph Lauren", "Carhartt WIP") or Vinted brand ids. Several brands = any of them.

## `sizes` (type: `array`):

Size labels as Vinted shows them: "M", "XL", "38", "W32", "42.5"… A label matches every size group that uses it (clothing and shoes). Works best together with a category. Vinted size ids are accepted too.

## `condition` (type: `array`):

Keep only items in these conditions. Empty = any condition.

## `category` (type: `string`):

Limit the search to one top-level Vinted category. For a sub-category paste its Vinted catalogue URL into Start URLs.

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

How many item pages are opened at once when item details are on. Higher is faster; Vinted may slow down very aggressive runs.

## `includeRunSummary` (type: `boolean`):

Adds one free row at the end of the dataset with what was delivered and charged in this run.

## Actor input object example

```json
{
  "searchQueries": [
    "nike air max"
  ],
  "country": "fr",
  "maxItems": 50,
  "sort": "newest",
  "includeDetails": false,
  "category": "any",
  "maxConcurrency": 10,
  "includeRunSummary": true
}
```

# Actor output Schema

## `items` (type: `string`):

One row per Vinted listing: title, price, fees, brand, size, condition, photos, favourites and seller; with item details also description, category, upload time and seller rating. Free error rows explain empty searches.

## `runStats` (type: `string`):

Counters for the run: items, details, duplicates skipped, pages read, which network route served the requests and what paid traffic cost.

# 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 = {
    "searchQueries": [
        "nike air max"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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 = {
    "searchQueries": ["nike air max"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/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 '{
  "searchQueries": [
    "nike air max"
  ],
  "maxItems": 50
}' |
apify call lergassy/vinted-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/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/zRGhUVXJCCF572K56/builds/xNa5UFUZWbQgKiuIu/openapi.json
