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

Extract Vinted items across 23 country sites as clean JSON with zero seller data - prices with buyer fees, brand, size, condition, demand signals. Newest-first monitoring, pay per result. Built for resale pricing, brand tracking and AI pipelines.

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

## Pricing

from $1.59 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Vinted Scraper — privacy-safe fashion resale data

Extract items from **Vinted** — Europe's largest fashion resale marketplace — as clean, structured JSON, across 23 national sites. Prices with buyer fees, brands, sizes, conditions, demand signals and photos, ready for resale pricing, brand monitoring and data pipelines.

**No seller personal data, ever.** This scraper is built privacy-first: seller usernames, user IDs and profile links never appear in the output — not as an option you have to remember to switch off, but by design. Only the business-vs-private flag survives.

### Quick start (30 seconds)

1. Put what you'd type in the Vinted search box into **searchQuery** — e.g. `nike air max`.
2. Pick your **domain** — `fr`, `de`, `co.uk`, `be`... (23 country sites).
3. Click **Start**. When the run finishes, open the dataset's **Overview** tab for a clean table, or **Export** it as CSV/Excel/JSON.

Optional knobs: a price band and newest-first sorting for monitoring — and any input works on a daily Schedule.

### What you can build with it

- **Price a resale inventory.** Search your brand and model, and get every live listing with `priceCents`, the buyer-protection fee and the total price — the real market price, not the sticker.
- **Watch a niche for underpriced drops.** Run `searchQuery: "arc'teryx"` with `sortBy: "newest"` hourly — every new listing arrives with brand, size and condition parsed.
- **Compare markets across countries.** The same query against `de`, `fr` and `co.uk` shows where an item is cheap to buy and dear to sell.
- **Feed an AI agent clean data.** Every field is structured, predictable and free of personal data, so an assistant or pipeline can consume it directly — no scrubbing, no compliance review before you store it.

### What you get

Each item is one dataset item:

```json
{
  "itemId": "9720000001",
  "url": "https://www.vinted.fr/items/9720000001-t-shirt-de-foot",
  "title": "T-shirt de foot",
  "brand": "Nike",
  "size": "12 ans / 152 cm",
  "condition": "Très bon état",
  "priceCents": 500,
  "currency": "EUR",
  "serviceFeeCents": 95,
  "totalPriceCents": 595,
  "businessSeller": false,
  "promoted": false,
  "favouriteCount": 2,
  "viewCount": 7,
  "imageUrls": ["https://images1.vinted.net/t/example/f800/1.webp"]
}
```

Field notes, so you know exactly what you are buying:

- `priceCents` is the asking price in minor units (cents, pence); `totalPriceCents` includes Vinted's buyer-protection fee — the price a buyer actually pays.
- `currency` follows the site you searched: EUR, GBP, PLN, SEK, ...
- `condition` and `size` come in the site's language, exactly as displayed.
- `favouriteCount` is a live demand signal — high favourites at a low price means it will sell fast.
- `businessSeller` separates professional sellers from private ones. Seller identity is never collected.

### AI analysis: comparable fields across free-form listings (optional)

Sellers type titles, brands and conditions however they like, in 23 languages. With `aiAnalysis: true`, every item additionally carries four AI-computed fields with a fixed, comparable vocabulary:

- `normalizedBrand` — canonical brand name ("nike air" → `Nike`), `unbranded` when there is none.
- `normalizedCategory` — one of a fixed set (`tops`, `shoes`, `bags`, `dresses`, ...), so you can group across sellers.
- `conditionScore` — the stated condition mapped to `1` (heavily worn) – `5` (new), language-independent.
- `listingQuality` — `excellent`/`good`/`fair`/`poor`: how complete and consistent the listing looks.

Analysis costs $0.50 per 1,000 analyzed items on top of the result price and is available on paid Apify plans. You are only charged for items that were actually analyzed and delivered — an item the analysis could not process ships normally and costs nothing extra. The model receives only the fields already in your dataset (title, brand, size, condition), classifies them into the fixed vocabulary above, and can output nothing else — the same whitelist principle that keeps seller identity out of this scraper applies to the AI output too.

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

$1.99 per 1,000 items delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain euros:

- **100 items ≈ $0.20** — a daily niche watch.
- **500 items ≈ $1.00** — a solid brand snapshot.

The price is all-inclusive — your runs' platform usage is covered by it, with no separate compute or proxy charges. Datacenter proxies are sufficient — no residential proxy surcharge needed.

Free-plan runs are limited to a sample of 25 items, enough to evaluate the output format against your real query.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:

```text
Help me set up the "Vinted Scraper" actor on Apify
(https://apify.com/lowlanddata/vinted-scraper). Guide me one step at a time.

What I want to watch: [E.G. "Nike Air Max under 40 euros on vinted.fr"]

Guide me to:
1. Propose my input values: searchQuery (what I'd type in the Vinted search box),
   domain (fr, de, co.uk, be, ...), an optional priceMin/priceMax band, sortBy
   "newest" for monitoring, maxItems, and whether I want aiAnalysis (adds
   normalized brand/category and a 1-5 condition score, $0.50 per 1,000 items).
2. Create a free Apify account (apify.com), open the actor page, paste the values
   into the Input form, and start a run.
3. Set up a daily Schedule in the Apify Console with the same input, plus an email
   or Slack integration so new results reach me automatically.
4. Show me how to export results as CSV/Excel, or read them from the API if I code.
5. If the results are what I wanted, remind me at the end to leave a quick rating on the actor page, and to report anything broken or missing on its Issues tab.
```

### Input

| Field                | Description                                                                                                                                                            |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchQuery`        | What you'd type in the Vinted search box. Required.                                                                                                                    |
| `domain`             | National site: `fr` (default), `be`, `de`, `nl`, `es`, `it`, `co.uk`, `pl`, `at`, `pt`, `cz`, `sk`, `lt`, `se`, `dk`, `fi`, `ie`, `lu`, `hu`, `ro`, `gr`, `hr`, `com`. |
| `priceMin`           | Only items costing at least this much (site currency).                                                                                                                 |
| `priceMax`           | Only items costing at most this much (site currency).                                                                                                                  |
| `sortBy`             | `newest` (default), `price_asc`, `price_desc`, or `relevance`.                                                                                                         |
| `aiAnalysis`         | `true` adds four AI-computed fields per item (see below). $0.50/1,000 analyzed items on top; paid Apify plans only. Default `false`.                                   |
| `maxItems`           | Stop after this many items (default 500).                                                                                                                              |
| `proxyConfiguration` | Proxy settings; keep Apify proxy enabled.                                                                                                                              |

A run minimally needs a `searchQuery`; invalid combinations (like an inverted price band) fail immediately with the reason in the run's status message.

### Use it from your code

Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):

```bash
curl "https://api.apify.com/v2/acts/lowlanddata~vinted-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -X POST -H "Content-Type: application/json" \
  -d '{"searchQuery": "nike air max", "domain": "fr", "maxItems": 100}'
```

Node.js:

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lowlanddata/vinted-scraper').call({
  searchQuery: 'nike air max',
  domain: 'fr',
  maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lowlanddata/vinted-scraper").call(
    run_input={"searchQuery": "nike air max", "domain": "fr", "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

Schedules, webhooks and the Make/Zapier/n8n integrations all work out of the box — this is a standard Apify actor.

### Use it with AI agents (MCP)

Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results — no glue code.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/vinted-scraper"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/vinted-scraper
```

Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

Prompts that work once connected:

- "Search vinted.fr for 'nike air max' under 40 euros and list the newest ten with total buyer price."
- "Compare 'levis 501' prices between vinted.de and vinted.co.uk and summarize the spread."
- "Watch Vinted for 'arc'teryx' and flag anything with more than 10 favourites."

### Is it legal to scrape Vinted?

Public listing data — prices, brands, sizes, conditions — is public commercial information, and this scraper is built so that the hard part of the question never arises: **no personal data enters your dataset in the first place.** The GDPR sets strict rules on personal data; an output that carries no usernames, no user IDs and no profile links is the point of this actor, not an afterthought.

Structurally, the extractor maps a fixed whitelist of fields out of the page's data. Seller identity and tracking parameters are never read into the output. Requests are paced, load on the site is kept negligible, and no anti-bot protection is bypassed — a blocked request is reported honestly, never fought.

One honest limit: item titles are the seller's own words, delivered as-is. If a seller chooses to type contact details into their title, that text is not rewritten — the guarantee covers the data fields, not the content sellers publish about themselves.

### Is there a Vinted API alternative?

Vinted publishes no public API. This actor is the practical alternative: the same items as structured JSON through one HTTP call (`run-sync-get-dataset-items`), on a schedule, or as an MCP tool for AI agents — with the privacy question already answered in the data itself.

### Does Vinted block scrapers?

Vinted protects some routes aggressively, and this actor deliberately stays on the openly served pages: paced requests, standard datacenter proxies, load kept negligible, no anti-bot bypassing. If the site does block a run mid-way, the items already collected are delivered with an honest note in the run status — you are never charged for what didn't arrive.

### How do I monitor Vinted prices?

Set `sortBy: "newest"` with your query, cap `maxItems` to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs — every new item lands in your inbox with the price already parsed to cents. The AI-assistant prompt above walks a non-technical user through exactly this setup.

### FAQ

**Can I get seller names or profiles?** No — by design. That is the product: data you can store, share and process without a privacy review.

**How deep does one search go?** Vinted serves at most 10 pages (~960 items) per search. Narrow by price band to see everything in busy categories.

**Which countries are covered?** 23 national sites, from France to the US — one `domain` value each.

**How fresh is the data?** Live at run time — every run queries Vinted directly. For continuous freshness, schedule the actor.

**Can I export to Excel or CSV?** Yes — every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.

**Does it work with Make, Zapier or n8n?** Yes — it is a standard Apify actor; all platform integrations, webhooks and schedules apply.

**Does Vinted have a public API?** No — Vinted publishes none. This actor is the practical substitute: the same items as structured JSON through one HTTP call, a schedule, or an MCP tool for AI agents.

**Do I need a Vinted account or API key?** No. The actor reads the openly served listing pages, so the only account involved is your Apify account — the free plan is enough to test with.

**How much does scraping Vinted cost?** $1.99 per 1,000 items delivered, pay-as-you-go. No subscription, and empty or failed runs cost nothing.

**Do I need residential proxies for Vinted?** No. Standard datacenter proxies through the default Apify proxy setting are sufficient — there is no residential surcharge to pay.

**What is the difference between priceCents and totalPriceCents?** `priceCents` is the seller's asking price; `totalPriceCents` adds Vinted's buyer-protection fee, which is what a buyer actually pays at checkout.

**Why are size and condition not in English?** They arrive exactly as the site displays them, in the site's language. Turn on `aiAnalysis` if you need a language-independent `conditionScore` from 1 to 5.

**What does the aiAnalysis option add?** Four comparable fields per item: normalized brand, normalized category, a 1–5 condition score and a listing-quality grade. It costs $0.50 per 1,000 analyzed items on top and needs a paid Apify plan.

**What happens if Vinted blocks my run?** Everything collected up to that point is delivered, the run status says so honestly, and you are not charged for items that didn't arrive. A retry a few minutes later usually lands on a clean proxy session.

**Why did my run stop at 25 items?** That is the free-plan sample cap, there to let you evaluate the output format. Paid Apify plans get full results up to your `maxItems`.

**Can I use this without writing any code?** Yes. Fill in the input form on the actor page and click Start — or paste the AI-assistant prompt above into ChatGPT or Claude and let it walk you through setup, scheduling included.

**How do I call it from my own code?** One HTTP POST to the `run-sync-get-dataset-items` endpoint returns the items directly for scoped runs up to about 5 minutes; the `apify-client` packages for Node.js and Python are shown above.

**Is it legal to scrape Vinted?** Public listing data — prices, brands, sizes, conditions — is public commercial information, and this actor's output carries no usernames, user IDs or profile links, so the personal-data question never enters your dataset.

**Can I track how prices change over time?** Each run is a live snapshot. Put the same input on a daily Schedule and your datasets accumulate into a price history you can chart.

**How do I tell professional sellers from private ones?** The `businessSeller` flag. That is the only seller-related signal in the output — identity is never collected.

**Is there a version of this for other marketplaces?** Yes — the Kleinanzeigen.de, Marktplaats.nl and 2dehands/2ememain scrapers linked below share the same clean-output guarantee.

### Related scrapers

The same clean-output guarantee across Europe's biggest marketplaces:

- [Kleinanzeigen.de Scraper](https://apify.com/lowlanddata/kleinanzeigen-scraper) — Germany's biggest classifieds site.
- [Marktplaats.nl Scraper](https://apify.com/lowlanddata/marktplaats-scraper) — the Netherlands' biggest marketplace.
- [2dehands / 2ememain Scraper](https://apify.com/lowlanddata/tweedehands-scraper) — Belgium's biggest classifieds site.

### Troubleshooting

The actor fails fast with the reason in the run's status message:

- **"priceMin must not be higher than priceMax."** — swap the two values.
- **"Vinted blocked the run before any results could be fetched. This is usually temporary - retry in a few minutes."** — a temporary block on the first request; a retry usually lands on a clean proxy session.
- **Fewer items than requested on a free plan** — the 25-item free sample cap; run on a paid Apify plan for full results.

### Support

Found an issue or missing a field you need? Open an issue on the actor's **Issues tab** — reports get fixed, this actor is actively maintained.

Working well for you? A **rating on this page** takes ten seconds and helps other buyers find a privacy-clean option among the lookalikes — it is also the clearest signal of what we should build next.

# Actor input Schema

## `searchQuery` (type: `string`):

What to search for on Vinted, exactly as you would type it in the site's search box, e.g. "nike air max" or "zara dress".

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

Which national Vinted site to search. Prices come in that site's currency.

## `priceMin` (type: `integer`):

Only include items costing at least this much, in the selected site's currency.

## `priceMax` (type: `integer`):

Only include items costing at most this much, in the selected site's currency.

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

Order of results: newest (best for monitoring), price\_asc, price\_desc, or relevance.

## `aiAnalysis` (type: `boolean`):

Add AI-computed fields to every item: normalizedBrand, normalizedCategory, conditionScore (1-5) and listingQuality - directly comparable across sellers' free-form listings. Billed $0.50 per 1,000 analyzed items on top of the result price. Paid Apify plans only.

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

Stop after this many items. Free-plan runs are capped at 25 items.

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

Proxy settings. Keep Apify proxy enabled.

## Actor input object example

```json
{
  "searchQuery": "nike",
  "domain": "fr",
  "sortBy": "newest",
  "aiAnalysis": false,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Scraped Vinted items, one JSON object per item.

# 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 = {
    "searchQuery": "nike",
    "domain": "fr",
    "sortBy": "newest",
    "aiAnalysis": false,
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/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 = {
    "searchQuery": "nike",
    "domain": "fr",
    "sortBy": "newest",
    "aiAnalysis": False,
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/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 '{
  "searchQuery": "nike",
  "domain": "fr",
  "sortBy": "newest",
  "aiAnalysis": false,
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call lowlanddata/vinted-scraper --silent --output-dataset

```

## MCP server setup

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