# Vinted Scraper — Listings & Item Details (`khadinakbar/vinted-scraper`) Actor

Scrape public Vinted listings by search or catalog/item URL for resale sourcing, price research, and market analysis. Returns prices, images, size, condition, and seller fields when public. Not for private accounts or buying automation. $0.005 per saved listing plus platform usage.

- **URL**: https://apify.com/khadinakbar/vinted-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** E-commerce, Automation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 88.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 vinted listing saveds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 — Listings, Prices & Seller Details

Vinted Scraper is an Apify Actor for public Vinted search terms, catalog URLs, and direct item URLs. It saves one dataset record per validated public listing or item-detail page, with fields such as item ID, title, brand, price, currency, size, condition, color, image URLs, public seller fields, market, and scrape time when Vinted shows them. The output is designed for resale sourcing, price research, and market analysis, and it is usable through Apify MCP as a structured data workflow.

### Best fit and connected workflows

This Actor fits workflows that start from public Vinted search keywords or a known public Vinted URL and need flat records for review, exports, or agent processing.

Good routing patterns include:

- Keyword searches for broad public catalog discovery.
- Catalog URLs for a saved public Vinted search page or filter view.
- Item URLs for one listing that needs item-level fields and images.
- Apify MCP workflows where an agent needs public Vinted records in a dataset it can read back.

### Practical scenario

Sara is comparing public listings for a used jacket before choosing what to source. She starts with the search term `carhartt jacket`, sets a small item cap, and runs the Actor in `search` mode. The returned dataset includes fields such as `title`, `brand`, `price`, `size`, `condition`, `sellerUsername`, `itemUrl`, and `scrapedAt`. Sara uses those fields to compare visible listings, then opens the public item URLs and seller links before moving to the next sourcing step.

### Input fields

| Field | Type | Description |
| --- | --- | --- |
| `mode` | `string` | Choose `search` for public keywords or `urls` for public catalog and item pages. |
| `searchQueries` | `array` | Public Vinted search terms, each executed separately. |
| `startUrls` | `array` | Public Vinted catalog or item URLs. |
| `market` | `string` | Vinted market used for keyword search URL construction; proxy country applies only when explicitly enabled. |
| `useResidentialProxy` | `boolean` | Default `false`: use the tested native browser route without residential traffic charges. Explicit `true` opts into residential routing, adds proxy usage charges, and is not verified by this release's cloud matrix. |
| `maxItems` | `integer` | Maximum validated listings saved and billed in the run. |
| `maxPages` | `integer` | Maximum public catalog pages loaded per search term. |
| `enrichDetails` | `boolean` | Opens each public item page to add detail fields when Vinted shows them. |

#### Focused JSON example

```json
{
  "mode": "search",
  "searchQueries": ["levis 501", "carhartt jacket"],
  "market": "uk",
  "maxItems": 10,
  "maxPages": 1,
  "enrichDetails": true
}
```

### Output fields

The Actor writes validated public listing and item-detail records to the default dataset. The `OUTPUT` record summarizes the terminal outcome, and `RUN_SUMMARY` provides execution diagnostics and billing counters.

| Field | Type | Description |
| --- | --- | --- |
| `itemId` | `string` | Public numeric Vinted item identifier. |
| `itemUrl` | `string` | Canonical public Vinted item URL. |
| `title` | `string` or `null` | Public item title shown by Vinted. |
| `brand` | `string` or `null` | Public brand label, when shown. |
| `price` | `number` or `null` | Displayed item price. |
| `currency` | `string` or `null` | Currency inferred from the public listing price. |
| `buyerProtectionPrice` | `number` or `null` | Displayed total including Buyer Protection when shown. |
| `size` | `string` or `null` | Public item size. |
| `condition` | `string` or `null` | Public Vinted condition label. |
| `color` | `string` or `null` | Public colour field from the item page. |
| `uploadedAtText` | `string` or `null` | Displayed relative upload time. |
| `sellerUsername` | `string` or `null` | Public seller profile name when shown. |
| `sellerUrl` | `string` or `null` | Public seller profile URL when shown. |
| `imageUrls` | `array` | Public image URLs displayed on the item page. |
| `market` | `string` | Vinted market inferred from the hostname. |
| `sourceType` | `string` | `search`, `catalog-url`, or `item-url`. |
| `scrapedAt` | `string` | ISO 8601 timestamp for when the record was saved. |

#### Illustrative output record

```json
{
  "itemId": "9400175531",
  "itemUrl": "https://www.vinted.co.uk/items/9400175531-levis-501-navy-w-34-l-32",
  "title": "Levis 501",
  "brand": "Levis",
  "price": 24,
  "currency": "GBP",
  "buyerProtectionPrice": 27.5,
  "size": "W34 L32",
  "condition": "Very good",
  "color": "Navy",
  "uploadedAtText": "3 days ago",
  "sellerUsername": "sample_seller",
  "sellerUrl": "https://www.vinted.co.uk/member/1234567-sample_seller",
  "imageUrls": [
    "https://images.vinted.net/sample-1.jpg",
    "https://images.vinted.net/sample-2.jpg"
  ],
  "market": "uk",
  "sourceType": "item-url",
  "scrapedAt": "2026-07-14T12:34:56.000Z"
}
```

### How it works

This Actor uses a browser-based approach for public Vinted pages. In `search` mode, it builds public catalog search URLs for the selected market and loads search results page by page until it reaches `maxPages` or `maxItems`. In `urls` mode, it processes the provided public catalog or item URLs directly. When `enrichDetails` is enabled, it opens each public item page to collect image URLs, buyer-protection total, colour, upload time, and public seller details when Vinted displays them. Records are saved to the default dataset, and the Actor also writes terminal outcome information to `OUTPUT` and `RUN_SUMMARY`.

Native browser egress is the default and was verified across all eleven supported markets. The market selects the Vinted domain, not the geographic location of the native IP. Set `useResidentialProxy: true` only when residential routing is specifically needed; this optional route is not part of the release's cloud acceptance matrix and adds proxy usage fees. Neither route guarantees future availability or bypasses authentication.

### Pricing

This Actor uses Pay per event plus Apify platform usage.

- Actor start: charged once when the Actor starts, scaled by allocated memory.
- Vinted listing saved: charged for each validated public Vinted listing or item-detail record saved to the default dataset.

The live Pricing tab shows the current pricing details for this Actor. For example, a run that saves ten listings creates ten listing-save events, plus the one-time actor-start event and platform usage.

### Use with AI agents (MCP)

This Actor is usable through Apify MCP as a tool for collecting public Vinted listing records from search keywords or URLs, then reading the resulting dataset rows.

Exact Actor identity: `khadinakbar/vinted-scraper`

Tool description: run this Actor to collect public Vinted search results or item pages into a dataset, then read the dataset rows for structured fields such as item URL, price, size, condition, seller username, and scrape time.

> Find public Vinted listings for "carhartt jacket" in the UK market, save up to 10 items, and return the dataset rows with item URL, price, size, condition, seller username, and scraped timestamp.

Output interpretation:

- `itemUrl` points to the public Vinted listing page.
- `price`, `currency`, `size`, and `condition` summarize the visible listing.
- `sellerUsername` and `sellerUrl` are public seller fields when Vinted shows them.
- `imageUrls` contains the public image links displayed on the item page.
- `scrapedAt` shows when the record was saved.

Provenance and scope:

- Records come from public Vinted catalog pages or public item pages.
- The Actor writes one dataset row per saved listing.
- Null values mean the public page did not expose that field during the run.

Pagination and cost guidance:

- `maxPages` controls how many public search pages load per keyword.
- `maxItems` caps how many validated records are saved and billed.
- Smaller caps reduce the number of listing-save events in a run.

### Apify API example

JavaScript with dataset readback:

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

const client = new ApifyClient({
  token: process.env.APIFY_TOKEN,
});

const run = await client.actor('khadinakbar/vinted-scraper').call({
  mode: 'search',
  searchQueries: ['vintage carhartt jacket'],
  market: 'uk',
  maxItems: 10,
  maxPages: 1,
  enrichDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Best results and outcome guidance

Use `search` mode when you want broad discovery from keywords, and use `urls` mode when you already have a public catalog page or a specific item page. Keep `maxItems` aligned with the number of records you want to review. Enable `enrichDetails` when you want item-page fields and image URLs, and keep it off when you want a faster card-level pass. For cross-market research, set `market` to the relevant Vinted locale so keyword searches align with that market's public catalog.

### Continue the workflow

- Then use [Walmart Product, Price and Review Data Scraper](https://apify.com/khadinakbar/walmart-data-extractor) to extend Vinted Scraper — Listings, Prices & Seller Details with a neighboring commerce research source when the brief calls for Walmart data.
- Then use [Tokopedia Scraper](https://apify.com/khadinakbar/tokopedia-scraper) to extend Vinted Scraper — Listings, Prices & Seller Details with a neighboring commerce research source when the brief calls for Tokopedia data.

### Design note

I found that the live dataset contract always includes `itemId`, `itemUrl`, `market`, `sourceType`, and `scrapedAt`, which makes each saved row easy to trace back to its public source and run context.

### FAQ

#### When should I use `search` instead of `urls`?

Use `search` when you want the Actor to discover public listings from keywords. Use `urls` when you already have a public Vinted catalog page or a direct item page that you want scraped as-is.

#### Which field should I use for a single public listing link?

`itemUrl` is the canonical public Vinted listing URL. It is the suitable field to carry forward into review workflows or downstream exports.

#### What does `sourceType` tell me?

`sourceType` shows how the Actor found the record: by keyword search, by catalog URL, or by direct item URL.

#### How can I route results into a spreadsheet or dashboard?

Read the default dataset and map the flat fields such as `title`, `brand`, `price`, `currency`, `size`, `condition`, `sellerUsername`, and `scrapedAt` into your table or dashboard columns.

#### Can I use the same workflow across multiple Vinted markets?

Yes. Set `market` to the relevant locale for keyword searches, or pass public URLs from the target Vinted hostname in `urls` mode.

### Responsible use

Use this Actor only for public Vinted pages and legitimate analysis workflows. Respect Vinted's terms, applicable law, and data-protection obligations. Keep runs proportionate to your use case, and prefer the smallest input and item cap that satisfies your task.

# Actor input Schema

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

Choose how Vinted targets are supplied. Use 'search' for one or more public Vinted search terms, or 'urls' for public catalog and item pages. Search defaults to a small Levis example; URLs mode requires startUrls. This is not a mode for private accounts, checkout, or seller messaging.

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

Public Vinted catalog terms to search, such as 'levis 501' or 'vintage carhartt jacket'. Each term is run separately and duplicate items are removed across the run. Defaults to 'levis 501' for a small working example. This is not a saved-search, alert, or authenticated inventory query.

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

Public Vinted catalog or item URLs to scrape, for example 'https://www.vinted.co.uk/catalog?search\_text=levis%20501' or a URL containing '/items/123'. Catalog URLs return listings and item URLs return one detailed record. Leave empty in search mode unless you want to combine targets. This does not accept non-Vinted pages, seller inboxes, or checkout URLs.

## `market` (type: `string`):

Select the Vinted market used to construct keyword-search URLs. For example, choose 'uk' for Vinted UK or 'fr' for Vinted France. Defaults to 'uk'; direct URLs retain their own Vinted hostname. The default uses native browser egress; a matching proxy country is requested only when residential proxy is explicitly enabled. This is not a shipping destination or currency-conversion setting.

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

Hard cap for validated Vinted records saved and billed across the entire run. For example, set 10 for a low-cost proof run or 100 for wider market research. Defaults to 10 and the actor refuses to charge beyond this cap. This is not a page count or a request-concurrency setting.

## `maxPages` (type: `integer`):

Maximum public catalog pages to load for each search keyword. For example, use 1 for the fast default run or 3 to inspect a broader result set. Defaults to 1 and stops earlier when maxItems is reached. This does not apply to direct item URLs and does not bypass Vinted restrictions.

## `useResidentialProxy` (type: `boolean`):

Optional Apify residential proxy matching the selected market. Disabled by default: native browser requests were verified across all supported markets without residential traffic charges. Enable only when you specifically need residential routing; that optional route is not covered by this release's cloud acceptance matrix and adds proxy usage fees. Neither route bypasses authentication or guarantees availability.

## `enrichDetails` (type: `boolean`):

Open each public item page to add photo URLs, buyer-protection price, colour, upload time, and public seller fields when Vinted displays them. For example, enable it for resale due diligence and disable it for faster price snapshots. Defaults to true for a richer record. This does not reveal private seller information or contact details.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "levis 501",
    "carhartt jacket"
  ],
  "startUrls": [
    "https://www.vinted.co.uk/catalog?search_text=levis%20501"
  ],
  "market": "uk",
  "maxItems": 10,
  "maxPages": 1,
  "useResidentialProxy": false,
  "enrichDetails": true
}
```

# Actor output Schema

## `listings` (type: `string`):

Validated public Vinted listing and item-detail records.

## `output` (type: `string`):

Compact terminal outcome, counts, and warnings.

## `runSummary` (type: `string`):

Detailed run diagnostics and billing counters.

# 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 = {
    "mode": "search",
    "searchQueries": [
        "levis 501",
        "carhartt jacket"
    ],
    "startUrls": [
        "https://www.vinted.co.uk/catalog?search_text=levis%20501"
    ],
    "market": "uk",
    "maxItems": 10,
    "maxPages": 1,
    "useResidentialProxy": false,
    "enrichDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "mode": "search",
    "searchQueries": [
        "levis 501",
        "carhartt jacket",
    ],
    "startUrls": ["https://www.vinted.co.uk/catalog?search_text=levis%20501"],
    "market": "uk",
    "maxItems": 10,
    "maxPages": 1,
    "useResidentialProxy": False,
    "enrichDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/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 '{
  "mode": "search",
  "searchQueries": [
    "levis 501",
    "carhartt jacket"
  ],
  "startUrls": [
    "https://www.vinted.co.uk/catalog?search_text=levis%20501"
  ],
  "market": "uk",
  "maxItems": 10,
  "maxPages": 1,
  "useResidentialProxy": false,
  "enrichDetails": true
}' |
apify call khadinakbar/vinted-scraper --silent --output-dataset

```

## MCP server setup

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