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

Scrapes Vinted second-hand listings — price with fees, brand, size, condition and seller — across 27 Vinted sites in Europe, the US and Australia.

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

## Pricing

from $1.50 / 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.

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 does Vinted Scraper do?

**Vinted Scraper** collects second-hand listings from [Vinted](https://www.vinted.com),
Europe's largest marketplace for pre-owned fashion. Paste a Vinted search link and
get every item's **price, the total a buyer pays with fees, brand, size, condition,
likes and seller** as a clean table.

It works across all **27 Vinted sites**, from the UK, France and Germany to Poland,
Lithuania, the United States and Australia. Try it with the two prefilled searches:
open the Actor, click **Start**, and the results are ready in about a minute. Because
it runs on the Apify platform, you also get API access, scheduled runs, integrations
(Google Sheets, Make, Zapier, webhooks), run monitoring and proxy rotation.

### Why scrape Vinted?

- **Resale price research**: see what a brand or model really sells for.
- **Cross-border comparison**: compare what the same item costs in different
  countries, side by side in one dataset.
- **Sourcing**: spot underpriced listings to buy for resale.
- **Monitoring**: run a newest-first search on a schedule to catch new listings
  for a brand or size.
- **Demand signals**: use favourite counts to see which items attract buyers.
- **Seller research**: find the business sellers active in a category.

### How to scrape Vinted listings

1. Go to Vinted and search, or open a category or brand page.
2. Narrow it down with the filters on the page, such as category, brand, size,
   condition, colour, material, price range or sort order.
3. Copy the address from your browser's address bar.
4. Paste it into **Vinted links**. Add more links, one per line, if you like. A UK
   search and a French search can be mixed in one run.
5. Click **Start**, then download the results when the run finishes.

Every filter in the link is kept, including several brands or sizes at once, so you
get only the items your search asks for. The country and currency come from
the link's site. Items arrive in the order Vinted shows them, including the promoted
items it mixes into searches sorted by relevance.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "search_urls": [
        "https://www.vinted.co.uk/catalog?search_text=nike",
        "https://www.vinted.fr/catalog?search_text=zara&price_to=20"
    ],
    "max_results_per_search": 200
}
```

| Field | What it does |
|---|---|
| `search_urls` | Vinted catalogue, search, category (`/catalog/1904-women`) or brand (`/brand/53-nike`) links, one per line. |
| `max_results_per_search` | Stops after this many items per link. Default: 200. Vinted lists at most **960 items per search** (10 pages of 96). |
| `proxy_country` | Optional 2-letter country code, such as `GB` or `DE`. Leave it empty and each link runs from a residential address in its own site's country. |

### Output

Each item becomes one row. Here is a real example:

```json
{
    "id": "10205612882",
    "title": "Grey Nike short set ( medium men’s )",
    "brand": "Nike",
    "size": "M",
    "condition": "Very good",
    "price": 15,
    "total_price": 16.45,
    "service_fee": 1.45,
    "currency": "GBP",
    "url": "https://www.vinted.co.uk/items/10205612882-grey-nike-short-set-medium-mens",
    "favourites": 2,
    "is_promoted": true,
    "seller_name": "hashtags019",
    "seller_id": "263984978",
    "seller_url": "https://www.vinted.co.uk/member/263984978",
    "is_business_seller": false,
    "image": "https://images1.vinted.net/t/04_01e1d_3itKNAoeX6BRQYZsLndKKkeo/f800/d4c38919.webp?s=f7ece82020a535054edea5260bef002614a93c9b",
    "images": ["https://images1.vinted.net/t/04_01e1d_3itKNAoeX6BRQYZsLndKKkeo/f800/d4c38919.webp?s=f7ece82020a535054edea5260bef002614a93c9b"],
    "country": "GB",
    "domain": "vinted.co.uk",
    "position": 12,
    "search_url": "https://www.vinted.co.uk/catalog?search_text=nike"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data fields

| Field | Description |
|---|---|
| `id` | Vinted's item ID. |
| `title` | The seller's title for the item. |
| `brand` | The brand Vinted shows on the item card. Empty for unbranded items; for some consoles it also names the model. |
| `size` | Size, as Vinted shows it. Empty for items without one. |
| `condition` | The condition the seller chose, in the site's language. |
| `price` | Asking price. |
| `total_price` | What a buyer pays once Vinted's buyer protection fee is added. |
| `service_fee` | The buyer protection fee on its own. |
| `currency` | Currency of the site, such as `GBP`, `EUR`, `PLN` or `USD`. |
| `url` | Link to the item page. |
| `favourites` | How many people favourited the item. |
| `is_promoted` | `true` when the seller paid to promote (bump) the item. Searches sorted by relevance mix these in, as Vinted does on the site. |
| `seller_name` | The seller's username. |
| `seller_id` | The seller's member ID. |
| `seller_url` | Link to the seller's profile. |
| `is_business_seller` | `true` for business (Pro) sellers. |
| `image` | Main photo. |
| `images` | Photos sent with the search result (currently the main one). |
| `country` | ISO country code of the site, such as `GB` or `FR`. |
| `domain` | The Vinted site the item came from. |
| `position` | The item's place in the results of its search, in Vinted's order. |
| `search_url` | The link the item came from. |

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

Vinted Scraper uses **pay-per-event** pricing, so you pay only for results:

- **$0.0015 per item** saved to the dataset, which is **about $1.50 per 1,000
  results**.
- **$0.00005 per run start**.

For example, 200 items from one search cost about $0.30. Apify's free plan includes
$5 of monthly credit, which covers roughly 3,300 items. Searches that return nothing
are never charged as results. If you set a maximum cost for a run, the Actor stops
as soon as it is reached.

### Tips for scraping Vinted

- **Filter on Vinted first.** Category, brand, size and price filters shrink the
  result set before the Actor sees it, which saves money.
- **Need more than 960 items?** Vinted stops every search at 960. Split a big
  search into narrower links, for example one per brand, size or price band.
- **Busy searches shift while they are read**, because new items keep arriving,
  most of all in newest-first listings. They can return fewer than 960 different
  items; each item still appears only once.
- **Compare like with like.** The listed price and the with-fees price are both
  included, because Vinted shows the smaller one in search results.
- **Leave out promoted items for price research.** Sellers pay to show these
  higher, so filter on `is_promoted` = `false` for a sample of ordinary listings.

### FAQ, disclaimers and support

**What happens to links that return nothing?** They are not saved as rows, so you
are not charged for them. A link pasted twice is scraped once. Each one is listed
with its reason in the `FAILED_INPUTS` record of the run's key-value store, and the
run's status message gives the counts. A run fails only when Vinted refuses every
search.

**Why is there no view count?** Vinted no longer sends view counts with search
results.

**Is it legal to scrape Vinted?** This Actor collects only publicly visible listing
information. Seller usernames and IDs can be personal data under the GDPR and
similar laws, so make sure you have a lawful reason to process them and do not use
them to contact or profile people. Vinted's Terms of Use restrict automated access,
so you are responsible for making sure your use complies with them and with the
laws that apply to you. If in doubt, ask a lawyer.

**Found a problem or need a custom solution?** Open an issue on the **Issues** tab
and we will look into it. Custom scrapers and data feeds are available on request.

# Actor input Schema

## `search_urls` (type: `array`):

Catalogue, search, category or brand links, one per line. Search on Vinted with whatever filters you want — category, brand, size, condition, price range, colour, sort order — then copy the address bar. Every filter in the link is honoured, and the country is taken from the link too, so you can mix the UK, France, Germany, Poland and the rest in one run.

## `max_results_per_search` (type: `integer`):

Stops after this many items for each link. Vinted lists at most 960 items per search (10 pages of 96), so higher values return 960 at most; split a big search into narrower links to get more.

## `proxy_country` (type: `string`):

A 2-letter country code, such as GB or DE. Leave empty and each link runs from an address in its own country.

## Actor input object example

```json
{
  "search_urls": [
    "https://www.vinted.co.uk/catalog?search_text=nike",
    "https://www.vinted.fr/catalog?search_text=zara&price_to=20"
  ],
  "max_results_per_search": 200
}
```

# Actor output Schema

## `dataset` (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 = {
    "search_urls": [
        "https://www.vinted.co.uk/catalog?search_text=nike",
        "https://www.vinted.fr/catalog?search_text=zara&price_to=20"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/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 = { "search_urls": [
        "https://www.vinted.co.uk/catalog?search_text=nike",
        "https://www.vinted.fr/catalog?search_text=zara&price_to=20",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "search_urls": [
    "https://www.vinted.co.uk/catalog?search_text=nike",
    "https://www.vinted.fr/catalog?search_text=zara&price_to=20"
  ]
}' |
apify call mina_safwat/vinted-scraper --silent --output-dataset

```

## MCP server setup

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