# Vinted Scraper - Listings, Prices, Brands & Sizes (`webdatalabs/vinted-scraper-pro`) Actor

Scrape Vinted listings by keyword or search URL across 11 marketplaces including the UK, France, Austria and the US. Get price, brand, size, condition, favourites and photos in each market's own currency. Track mode compares scheduled runs and flags new listings and price drops.

- **URL**: https://apify.com/webdatalabs/vinted-scraper-pro.md
- **Developed by:** [WebDataLabs](https://apify.com/webdatalabs) (community)
- **Categories:** E-commerce, Agents, Business
- **Features:** Limited permissions
- **Stats:** 25 total users, 2 monthly users, 99.4% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 listing scrapeds

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 - Listings, Prices & Change Tracking

Scrape Vinted listings, prices and demand across 17 markets — by keyword or URL — and track new listings and price drops over time.

### What is the Vinted Scraper?

**Vinted Scraper** pulls structured second-hand fashion data from [Vinted](https://www.vinted.com) across 17 markets in Europe and the US — search by keyword or paste any Vinted URL. It answers the two questions resellers live on: **what's available and underpriced right now**, and **what changed since yesterday** — new listings and price drops on the searches you follow. Vinted publishes no official public API, so this is the reliable way to get clean, export-ready listing and price-tracking data at volume. No code, no login, no proxies to manage.

### What data can you extract from Vinted?

The high-value fields (every run also returns the full flat record — see the dataset schema):

| Field | Example |
|-------|---------|
| `title` | `Nike Air Max 90 white` |
| `price` / `currency` / `priceWithFees` | `45` · `EUR` · `48.70` |
| `brand` / `size` / `condition` | `Nike` · `42` · `Very good` |
| `favouriteCount` | `23` (demand signal) |
| `photos` | array of image URLs |
| `sellerIsBusiness` | `false` (private) / `true` (Vinted Pro / business) |
| `country` / `url` | `de` · direct listing link |
| **Track mode only:** `changeType` / `previousPrice` / `daysListed` | `price_drop` · `55` · `7` |

### Example output

**Search mode** — one flat record per listing. Nothing the actor cannot fill is included, so there are no empty columns in your CSV:

```json
{
  "id": "10115025622",
  "title": "Nike air max 95",
  "price": 95,
  "currency": "GBP",
  "priceWithFees": 100.45,
  "serviceFee": 5.45,
  "brand": "Nike",
  "size": "9",
  "condition": "Very good",
  "favouriteCount": 2,
  "photos": [
    "https://images1.vinted.net/tc/02_01011_uFmVhx5skwoJwRdxwjrHs9mH/74cdf7cd.webp?s=3d98746a4f042412b83bc86738731592ef422691"
  ],
  "sellerIsBusiness": false,
  "country": "co.uk",
  "url": "https://www.vinted.co.uk/items/10115025622-nike-air-max-95",
  "scrapedAt": "2026-09-24T09:15:21.006Z"
}
```

`brand`, `size` and `condition` are exactly what Vinted shows on the listing card, in the marketplace's own language (`Very good` on vinted.co.uk, `Sehr gut` on vinted.de). They are `null` when the listing has none — books and consoles have no size, and unbranded items have no brand.

**Track changes mode** — each record also carries the cross-run measurement. An illustrative row for a listing whose seller cut the price from 55 to 45 between two scheduled runs:

```json
{
  "id": "4567891234",
  "title": "Nike Air Max 90 white",
  "price": 45,
  "currency": "GBP",
  "brand": "Nike",
  "size": "9",
  "condition": "Very good",
  "country": "co.uk",
  "url": "https://www.vinted.co.uk/items/4567891234-nike-air-max-90-white",
  "scrapedAt": "2026-06-27T09:10:00.000Z",
  "changeType": "price_drop",
  "previousPrice": 55,
  "firstSeenAt": "2026-06-20T09:14:00.000Z",
  "lastSeenAt": "2026-06-27T09:10:00.000Z",
  "daysListed": 7
}
```

`previousPrice` appears only on rows where `changeType` is `price_drop` or `price_rise` — an unchanged listing has no previous price, so the field is left out instead of shipped empty.

### How do I scrape Vinted? (quick start)

1. **Enter a query** — a keyword like `nike air max`, or filter on Vinted's own site and paste the URL (brand/size/price filters carry over, so there are no IDs to look up).
2. **Pick countries** — a keyword is searched in every country you select.
3. **Choose a mode and run** — *Search* for a one-off pull, or *Track changes* to monitor new listings and price drops over time, then export CSV / JSON / Excel or connect the dataset to your workflow.

Search a keyword across two markets:

```json
{ "query": ["nike air max"], "countries": ["de", "fr"], "maxItems": 200 }
```

Track changes on a filtered Vinted URL (run on a daily schedule):

```json
{ "query": ["https://www.vinted.de/catalog?search_text=jordan&brand_ids[]=53"], "mode": "track", "maxItems": 500 }
```

### What are the two modes: Search and Track changes?

- **Search** — returns current matching listings at volume. Best for market pulls and price research. Records contain the listing fields only; there is nothing to track on a one-off pull, so no tracking columns are added.
- **Track changes** — on each scheduled run, compares against the previous run of the same query and flags **new listings** and **price drops / rises**, with first-seen and last-seen dates. Each query keeps its own history in a named store. Records gain `changeType`, `firstSeenAt`, `lastSeenAt` and `daysListed`, plus `previousPrice` on price-change rows.

Track mode is a **measurement over time**: the first run is the baseline (everything is `new`, `daysListed` is 0), and the answers appear from the second run onwards. Run it on a schedule — a single one-off track run has nothing to compare against.

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

**Pay per listing returned** — you only pay for the results you get, with no monthly subscription and no per-run start fee. The current rate is shown in the pricing box on this page. Residential proxies are included, so you never buy or configure proxies. Tip: start with a small `Max listings` value to keep test runs cheap.

### Who uses the Vinted Scraper?

- **Sneaker & streetwear flippers** — search a brand, sort by price low-to-high, and act on listings with a high `favouriteCount` (hot items) priced below the market.
- **Cross-border arbitrage resellers** — run the same keyword in `pl`, `de`, and `fr`, compare `price`, and source where a category is cheap to resell where it's rich.
- **Vinted power sellers & shops** — Track mode shows which brands/sizes linger (`daysListed`, counted from the first run that saw the item) and where sellers are cutting prices, so you price and restock with data.
- **Brand & market researchers** — measure second-hand pricing, brand demand, and price movement across EU markets over time.
- **Repricing & inventory tools** — pipe clean JSON/CSV into n8n, Zapier, Make, or Google Sheets as a pricing feed.

### Does it tell me what sold?

**No, and it will not pretend to.** Vinted publishes no sold list, no sold-price API, and no sold flag this actor can read. The only available proxy is "the listing vanished from search" — and that proxy does not survive testing: Vinted's own match count for one unchanged keyword query moved between **40, 85, 70 and 52 within minutes**, because its text search is neither complete nor deterministic and every run arrives from a different residential IP. Treating that as sales produced 22 "sold" listings in a two-minute window, several of which were still openly for sale afterwards.

Rather than ship invented sales, this actor reports only what it can stand behind: **which listings are new, which changed price, and how long each has been up since tracking began** (`daysListed`). For sell-through, the honest read is: listings that stop showing up over several days, combined with `favouriteCount` momentum, tell you what is moving — without a fabricated "sold" column in your CSV.

### Which countries are supported?

Germany, France, United Kingdom, Italy, Spain, Netherlands, Poland, Belgium, Austria, Portugal, Czechia, Slovakia, Hungary, Romania, Lithuania, Luxembourg, and USA / International — 17 Vinted marketplaces, each in its local currency.

### FAQ

#### Is it legal to scrape Vinted?

This tool collects only publicly visible **listing** data (item, price, brand, size, condition, demand). It deliberately does **not** collect seller identity — no seller name, user ID, or profile link — only a non-identifying business/private flag, so there is no personal data of individual sellers in the output. You are responsible for complying with Vinted's Terms and the law in your region.

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

No. Residential proxies are built in, and no login is required — it reads public listings only.

#### How do I track price history and new listings?

Choose *Track changes* mode and **schedule** the actor (Apify → Schedules). The first run is a baseline (every listing comes back as `new`); every later run reports what's new and what changed price (with `previousPrice`). History is kept per query, so keep the query and country stable between runs.

#### Can I filter by brand, size, condition, or price?

Yes. For a keyword search, use the Advanced inputs (price, condition, sort). For anything more specific, filter on Vinted's own site and paste the resulting URL — its brand/size/category filters are applied automatically.

#### Can I scrape a specific seller or a single item URL?

Not yet — seller-profile and single-item scraping are on the roadmap (those endpoints have stricter protection). Use a keyword or a search URL for now.

#### Can I export to CSV, Excel, or Google Sheets?

Yes. Every run's dataset exports to CSV, JSON, Excel, or XML, or connects via API and webhooks to n8n, Zapier, and Make.

#### Why did a run return fewer items than my limit?

That query simply has fewer live listings, or Vinted's per-search result cap was reached (Vinted serves at most 960 results per search; split a broad search into narrower queries to get more). Vinted also pads a search that has few or no matches with unrelated "similar items". The actor delivers at most as many listings as Vinted counts as matching (its best-ranked ones), a search with no matches delivers and charges nothing, and the run's status message says how many suggestions were skipped.

#### What happens if Vinted blocks a search or changes its site?

The run tells you, and it never passes a failure off as "no results". A query that gets no usable answer from Vinted is reported as failed in the run's status message, with the reason. If every query in a run failed, the run ends as **Failed**, so your schedules and alerts catch it. You are never charged for listings that were not delivered.

#### What are the data limitations?

`viewCount`, seller ratings, and full item descriptions live on Vinted's item-detail endpoint, which is blocked to this actor. Vinted's catalog API exposes no listing-creation date, so there is no "listed on" field — `daysListed` is the tracked window instead. There is no sold data at all (see above).

### Related actors

- [Etsy Scraper Pro](https://apify.com/webdatalabs/etsy-scraper-pro) — handmade & vintage pricing.
- [Reddit Scraper Pro](https://apify.com/webdatalabs/reddit-scraper-pro) — monitor r/flipping and deal chatter.

### Support

Found a bug, or need a field or country added? Open a ticket on the actor's **Issues** tab, or reach the team via the [WebDataLabs profile](https://apify.com/webdatalabs). We keep the scraper updated when Vinted changes its site.

### Leave a review

Is this actor saving you time? A quick review on the Store helps other people find it — and tells us which fields to add next. **[Rate this actor →](https://apify.com/webdatalabs/vinted-scraper-pro)**

# Actor input Schema

## `query` (type: `array`):

One or more of: a keyword (e.g. 'nike air max'), or a full Vinted search URL (filter on Vinted's site, then copy the URL — brand/size/price filters carry over, no IDs to look up). Add several to scrape them all.

## `countries` (type: `array`):

Which Vinted country marketplaces to search. A keyword is searched in every selected country (more countries = more results, and lets you compare prices across markets). Ignored for pasted URLs (the URL already points at a country).

## `mode` (type: `string`):

Search = get current matching listings. Track changes = compare against the previous run of the same query and flag NEW listings and PRICE DROPS / RISES, with first-seen and last-seen dates. Track changes only makes sense on a schedule (e.g. daily); run it once to set a baseline, then let it run. Note: Vinted publishes no sold data, and its search is not deterministic, so listings that stop appearing are not reported as sold.

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

Maximum listings to return per query (per country). Start small (100) to keep test runs cheap; raise for production.

## `priceFrom` (type: `integer`):

Only listings at or above this price (local currency). Applies to keyword searches; ignored for pasted URLs.

## `priceTo` (type: `integer`):

Only listings at or below this price (local currency). Applies to keyword searches.

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

Filter keyword searches by item condition. Leave empty for all conditions.

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

Sort order for keyword searches.

## `useApifyProxy` (type: `boolean`):

Required. Vinted blocks datacenter IPs immediately; this actor uses residential proxies to work reliably. Only disable for debugging.

## Actor input object example

```json
{
  "query": [
    "nike air max"
  ],
  "countries": [
    "de"
  ],
  "mode": "search",
  "maxItems": 100,
  "condition": [],
  "sort": "relevance",
  "useApifyProxy": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `sales` (type: `string`):

No description

## `full_data` (type: `string`):

No description

# 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 air max"
    ],
    "countries": [
        "de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdatalabs/vinted-scraper-pro").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 air max"],
    "countries": ["de"],
}

# Run the Actor and wait for it to finish
run = client.actor("webdatalabs/vinted-scraper-pro").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 air max"
  ],
  "countries": [
    "de"
  ]
}' |
apify call webdatalabs/vinted-scraper-pro --silent --output-dataset

```

## MCP server setup

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

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/6SicVYk7hp3Dctggh/builds/kndsQcqfIdvc0FZ5T/openapi.json
