# Vinted Items Scraper (`neuro-scraper/vinted-items-scraper`) Actor

Vinted Scraper SD - Vinted Scraper is an e-commerce data tool that extracts Vinted search results by keyword or URL on 26 country sites: price, buyer-protection fee, brand, size, condition, favourites, photos and seller, 96 items per page, plus optional item details.

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

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 — Vinted listings, prices and sellers from 26 country sites

Vinted Scraper reads Vinted search results the way a logged-out visitor sees them. Type a search term, or paste any Vinted search, catalog, brand or item URL, and get one row per listing: title, price, buyer-protection fee and total, brand, size, condition, favourites, photo and seller id.

Turn on **Include item details** to also get the description, colour, material, category path, all photos, upload time, reservation state and the seller's name, review count, reputation and last-seen time.

No login, no cookies, no browser. Pagination runs page after page (96 items per page) until `maxItems` or Vinted's last page.

#### Input

| Field | Type | Default | Meaning |
|---|---|---|---|
| `searchTerms` | array | `["nike air max"]` (prefill) | Text typed in the Vinted search box, one term per line |
| `startUrls` | array | empty | Vinted URLs from any country site, detected automatically: search / catalog URLs (their filters, sort and price range are kept), brand pages (`/brand/53-nike`) and item URLs (`/items/<id>-<slug>`) |
| `domain` | select | `vinted.fr` | Country site for the search terms (26 sites: fr, de, co.uk, it, es, nl, be, at, lu, pl, cz, sk, lt, lv, ee, pt, se, fi, dk, hu, ro, hr, si, gr, ie, com) |
| `maxItems` | integer | `20` | Total rows to return |
| `maxPagesPerSearch` | integer | `10` | Safety cap on result pages per search term or URL |
| `sort` | select | `relevance` | `relevance`, `newest_first`, `price_low_to_high`, `price_high_to_low` (search terms; URLs keep their own `order=`) |
| `priceFrom`, `priceTo` | integer | `0` (off) | Price range in the site's currency (search terms) |
| `includeDetails` | boolean | `false` | Open every item page for the detail fields below: one extra request (about 3 s) per row |
| `proxyConfiguration` | proxy | Apify RESIDENTIAL | Choose the proxy country of the Vinted site you scrape |

#### Output

| Field | Meaning |
|---|---|
| `id`, `title`, `url` | Vinted item id, title, item page |
| `price`, `currency` | Seller's price in the site currency (EUR, GBP, PLN, CZK, SEK, DKK, HUF, RON, USD) |
| `serviceFee`, `totalPrice` | Buyer-protection fee and price + fee, as Vinted shows them |
| `brand`, `size`, `condition` | As shown on the listing, in the site's language; `null` when the item has none (books have no brand or size) |
| `favouriteCount` | Number of favourites (hearts) |
| `isPromoted` | Promoted listing (Vinted: sellers pay to boost visibility) |
| `photo`, `thumbnail` | Main photo (large) and the 310 px card image |
| `sellerId`, `sellerIsBusiness` | Seller id, Pro seller flag |
| `page`, `position` | Result page and position across pages (search rows) |
| `searchTerm` or `inputUrl` | The input that produced the row |
| `domain`, `searchUrl`, `scrapedAt` | Vinted site, results page the row came from, UTC time |
| **With item details** (and for item URLs) | |
| `description`, `colour`, `material` | Seller's text and attributes (`material` only when the seller set it) |
| `category`, `catalogId`, `brandId` | Category path (e.g. `Femmes > Chaussures > Baskets`) and Vinted's ids |
| `photos`, `photosCount` | All photo URLs |
| `uploadedAgo` | Upload time as Vinted prints it ("Il y a 2 heures", "42 min ago") |
| `availability`, `isReserved` | `InStock` etc., reservation flag |
| `sellerUsername`, `sellerUrl` | Seller name and profile link |
| `sellerFeedbackCount`, `sellerFeedbackReputation` | Review count and Vinted's reputation score (0 to 1, e.g. 0.98) |
| `sellerLastSeen`, `sellerBadges` | "Last seen an hour ago", badges such as `ACTIVE_LISTER` |

#### Measured limits (2026-10-03)

- Vinted serves at most **10 pages of 96 = 960 items per search** (every real search we ran on the 26 sites reported 960 results on 10 pages; page 11 is empty). For more, split the search by price range, brand, size or category URL.
- Items repeat between pages; rows are de-duplicated per search. "levis 501": 3 pages gave 96 + 83 + 71 new rows = 250 unique items.
- A search with no real match still returns Vinted's loose matches (a nonsense word gave 25 items).
- Speed from one home connection: 20 rows in 4-6 s, 250 rows in 15 s, 193 rows in 9 s; with item details about 3 s per item (6 rows in 20 s).
- `uploadedAgo` is relative text in the site language; Vinted shows visitors no exact upload date.
- Vinted is behind Cloudflare. Without a proxy, after about 100 page loads in an hour, our home IP got Cloudflare's JavaScript challenge (HTTP 403) on vinted.fr, .de, .co.uk and .it for minutes at a time. The Actor never solves challenges: with a proxy it retries on new IPs (up to 12 per page), without a proxy it stops calling that site for the run. Runs on the platform use Apify residential IPs, which we could not measure locally.
- Seller profile URLs (`/member/...`) are not supported.

#### Example input

```json
{"searchTerms": ["levis 501"], "domain": "vinted.fr", "sort": "newest_first", "priceFrom": 10, "priceTo": 40, "maxItems": 200}
```

# Actor input Schema

## `searchTerms` (type: `array`):

What you would type in the Vinted search box, one term per line. Each term is searched on the Vinted country site chosen below. Example: nike air max

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

Vinted URLs from any country site, detected automatically: a search or catalog URL with your filters (e.g. https://www.vinted.de/catalog?search_text=adidas\&brand_ids\[]=14\&order=newest_first), a brand page (https://www.vinted.fr/brand/53-nike) or an item URL (https://www.vinted.co.uk/items/1234567890-zara-dress). Filters, sorting and price range in a URL are kept as they are.

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

Vinted site searched for the search terms above. Each country site has its own listings, language and currency (vinted.fr: EUR, vinted.co.uk: GBP, vinted.pl: PLN ...). URLs always use their own site. Tip: on the platform pick the proxy country of this site in the proxy settings below.

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

Maximum number of items to return in total. Pages of 96 are read one after another until this number is reached or Vinted has no next page. Example: 200

## `maxPagesPerSearch` (type: `integer`):

Safety limit on result pages read per search term or URL. Vinted shows at most 10 pages of 96 (960 items) for one search. Example: 10

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

Order of the results for the search terms (URLs keep their own order= value). Example: newest_first to get the latest listings first.

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

Only items priced at or above this amount, in the currency of the chosen Vinted site (search terms only). 0 = no minimum. Example: 10

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

Only items priced at or below this amount, in the currency of the chosen Vinted site (search terms only). 0 = no maximum. Example: 50

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

Open each item's page and add description, colour, category, catalog and brand ids, all photos, upload time, reservation state and seller name, rating, review count, last-seen time and badges. Costs one extra request (about 3 seconds) per item.

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

Proxy used for Vinted. Residential proxy is the default; for best results choose the proxy country of the Vinted site you scrape (e.g. France for vinted.fr, United Kingdom for vinted.co.uk).

## Actor input object example

```json
{
  "searchTerms": [
    "nike air max"
  ],
  "startUrls": [],
  "domain": "vinted.fr",
  "maxItems": 20,
  "maxPagesPerSearch": 10,
  "sort": "relevance",
  "priceFrom": 0,
  "priceTo": 0,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchTerms": [
        "nike air max"
    ],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/vinted-items-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 = {
    "searchTerms": ["nike air max"],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/vinted-items-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 '{
  "searchTerms": [
    "nike air max"
  ],
  "startUrls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/vinted-items-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/vinted-items-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/FzFXDYKVUceAVj2EI/builds/SaFSb6cXHIbZXcekN/openapi.json
