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

Scrape Vinted search results by keyword or catalog URL on UK, France, Germany, Italy, Spain, Netherlands, Belgium, Poland and US sites: listing title, brand, size, condition, price, buyer total, favourites, photo and link. No login.

- **URL**: https://apify.com/webdatatools/vinted-scraper.md
- **Developed by:** [Murat Uzun](https://apify.com/webdatatools) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

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, Brands, Sizes)

### What is Vinted Scraper?

Vinted Scraper reads Vinted search results by keyword or by a catalog link you copy from Vinted, on the UK, France, Germany, Italy, Spain, Netherlands, Belgium, Poland and US sites. It returns one row per listing: title, brand, size, condition, price, buyer total (price plus Vinted fee), favourites, photo and link. It needs no login and reads only what the public catalog page shows.

### What data does Vinted Scraper extract?

| Field | Type | Source on the catalog page |
|---|---|---|
| `id` | string | Listing ID in the link |
| `title` | string | Listing title (from the card's link title) |
| `brand` | string | Brand line on the card |
| `size` | string | Size (from the card label, else the "size · condition" line) |
| `condition` | string | Condition (localised to the site, e.g. "Very good", "Sehr gut", "Satisfaisant") |
| `price` | number | Listing price, in the site's currency |
| `currency` | string | GBP, EUR, PLN or USD, from the chosen site |
| `totalPrice` | number | Buyer total shown on the card (price plus Vinted fee) |
| `favouriteCount` | number | Favourites. A card with no count shows 0. |
| `photoUrl` | string | Main photo |
| `url` | string | Listing link |
| `country`, `searchQuery`, `searchUrl`, `sourcePage` | string / number | Where the row came from |
| `source`, `scrapedAt` | string | Source tag and UTC scrape time |

**Not returned:** seller username and seller profile. The catalog card does not show the seller, and reading it would mean one extra page request per listing and collecting profile data. It is left out on purpose.

**Not verified:** the buyer total is the figure printed on the card; the fee rules themselves were not checked. Sites other than UK, DE and FR were not run in the cloud (see Verification).

### How to use Vinted Scraper

1. Type search words in **Search words**, one per line, e.g. `nike hoodie`. Or paste catalog links from Vinted with your filters into **Vinted catalog URLs**.
2. Pick the **Vinted site** and the **Sort by** order. For a catalog link, the link's own filters and order are kept.
3. Set **Max listings per search**. The actor pages through results (about 96 per page) until it has that many.
4. Start the run and download the dataset.
5. Set a **max total charge** if you want a cap. The run stops before it exceeds the cap.

If you paste catalog links, clear the default word `nike` from **Search words** (it is searched too otherwise). Only catalog links on a vinted.\* domain are accepted.

### Example input

```json
{
    "searchQueries": ["levi 501"],
    "country": "fr",
    "sortBy": "price_low_to_high",
    "maxItems": 30
}
```

### Example output

Real rows from a cloud run (2026-10-23, French site, 30 listings, sorted by price low to high):

```json
{
    "id": "…",
    "title": "Shorts Levi's 501 W32",
    "url": "https://www.vinted.fr/items/…-shorts-levi-s-501-w32",
    "brand": "Levi's",
    "size": "W32",
    "condition": "Satisfaisant",
    "price": 1,
    "currency": "EUR",
    "totalPrice": 1.75,
    "favouriteCount": 0,
    "country": "fr",
    "searchQuery": "levi 501",
    "sourcePage": 1
}
```

(The `id` and URL above are truncated on purpose; the real rows carry the full values.)

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | `["nike"]` | Words to search, one per line. Each is a separate search. |
| `searchUrls` | array | empty | Vinted catalog links with your filters. Kept as they are. |
| `country` | string | `co.uk` | Vinted site: co.uk, fr, de, it, es, nl, be, pl, com. |
| `sortBy` | string | `newest_first` | Relevance, newest first, price low to high, price high to low. |
| `maxItems` | integer | 96 | Listings to keep for each search (1 to 2000). |
| `proxyMode` | string | `auto` | `auto`, `never` (direct only) or `always` (Residential from the start). |

### Pricing

Pay per result. You pay for each listing row written to the dataset, plus a small start fee per run.

- Price: **$0.0025 per listing** on the Free tier, with volume tiers down to $0.0015 (Gold to Diamond).
- Start fee: $0.00005 per run.
- Public leader for comparison: epicscrapers/vinted-search-scraper charges $0.003 per item, plus $0.01 per run (checked on the Apify public API, 2026-10-23, 119 users in 30 days). scrape.badger/vinted-scraper charges $0.001 per item with 71 users in 30 days; this actor is above that price.
- Measured cost: two 150-listing runs (2 pages, co.uk) used $0.004 and $0.001 of platform usage, about $0.00001 to $0.00003 per listing. Both used the CLI default of 4 GB memory; the 512 MB default was not measured.

### Vinted Scraper vs. alternatives

This actor needs no login and reads the public catalog. It covers nine Vinted sites. Its price is below the most-used public Vinted actor (see Pricing). Other actors' result quality was not benchmarked, so no comparison of results is made here.

### Using Vinted Scraper with AI agents / MCP

Pay-per-result, so an AI agent can call it through the Apify MCP server with `searchQueries` or `searchUrls` and read the dataset rows. Each row has a stable `id`.

### Verification

Cloud runs on 2026-10-23:

- co.uk, search "nike hoodie", newest first, 150 listings (2 pages): 150 rows, 150 unique IDs, status SUCCEEDED. Fill rate 150/150 for title, brand, size, condition, price, currency, buyer total, favourites, photo and link (63 of them have zero favourites). Run ID in the Apify console; second run after the favourite fix.
- de, catalog link "adidas jacke", 40 listings: 40 rows, 40 unique IDs, SUCCEEDED. Brand, size, price and currency (EUR) filled for all rows.
- fr, search "levi 501", price low to high, 30 listings: 30 rows, 30 unique IDs, SUCCEEDED. Condition filled 30/30 (localised, e.g. "Satisfaisant"); size is empty on 3 rows where the listing has no size.

Not run in the cloud: .com, it, es, nl, be, pl. They use the same page structure; this is not measured.

### FAQ

**Does it need a Vinted account?** No.

**Does it return the seller?** No. See the note under "What data".

**Why do some sizes say null?** Accessories and some listings have no size. The field is left empty instead of being guessed.

**What if Vinted blocks the run?** The run waits and retries. In `auto` mode it switches to the Residential proxy. A search that still fails is reported in the run log.

**How many results can I get?** Vinted pages are about 96 listings each. The actor pages until your maximum, or until the search has no more pages (a hard limit of 50 pages per search).

**Which errors can I see?** A search that returns no listings is counted in the run summary. A run with no readable listing fails with a message.

### Related Actors

Other actors in this series (Yan PC / WebDataTools): LinkedIn Company Scraper, LinkedIn Jobs Scraper, Trendyol Scraper.

### Support

Use the Issues tab in the actor page on Apify Console. Include the run ID and the input you used.

# Actor input Schema

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

Words to search on Vinted, one per line, e.g. `nike hoodie` or `vintage levi 501`. Each one is a separate search.

## `searchUrls` (type: `array`):

Optional: catalog links copied from Vinted with your filters (brand, size, price, status), e.g. `https://www.vinted.co.uk/catalog?search_text=nike&size_ids[]=…`. Filters are kept.

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

Which Vinted site to search. Prices are in that site’s currency.

## `sortBy` (type: `string`):

Order of the results.

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

How many listings to keep for each search word or URL (about 96 per page).

## `proxyMode` (type: `string`):

auto: direct first, Apify Residential proxy only if Vinted blocks. never: direct only. always: Residential from the start.

## Actor input object example

```json
{
  "searchQueries": [
    "nike"
  ],
  "country": "co.uk",
  "sortBy": "newest_first",
  "maxItems": 96,
  "proxyMode": "auto"
}
```

# Actor output Schema

## `results` (type: `string`):

All listings from this run.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdatatools/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"] }

# Run the Actor and wait for it to finish
run = client.actor("webdatatools/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"
  ]
}' |
apify call webdatatools/vinted-scraper --silent --output-dataset

```

## MCP server setup

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