# Vinted Listings & Condition Scraper (`devilscrapes/vinted-listings-scraper`) Actor

Search Vinted (vinted.com/.co.uk/.de/.fr) catalog listings by keyword — one row per item with price, condition, brand, size, seller, and photo. Built for resale-arbitrage comps. No login; we handle the retries.

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

## Pricing

from $2.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/platform/actors/running/actors-in-store#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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Vinted Listings & Condition Scraper

**💰 $2.51 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Search Vinted (`vinted.com` / `.co.uk` / `.de` / `.fr`) catalog listings by keyword — one row per item with price, condition, brand, size, seller, and photo. Built for resale-arbitrage comps. No login; we handle the retries.

</div>

***

### 🎯 What this scrapes

Vinted is Europe's largest resale marketplace, and it doesn't publish a clean price-comps export — resellers checking what an item is actually worth are stuck scrolling active listings by hand across four separate country domains. This Actor queries Vinted's own catalog search by keyword — optionally narrowed by brand, size, and price band — across `vinted.com`, `vinted.co.uk`, `vinted.de`, and `vinted.fr`, and hands back one clean row per active listing: price, condition, brand, size, seller, favourite count, and photo.

**Honesty note**: this Actor returns Vinted's public catalog of **active, visible listings** — price and condition intel for what's currently for sale — not a closed-sale "sold comps" transaction history. Vinted's public API doesn't expose a sold flag; see Limitations below.

### 🔥 What we handle for you

- 🛡️ **We rotate browser fingerprints** — `curl-cffi` impersonation replays a real Chrome TLS handshake, rotating profiles between retries so Vinted sees a browser, not Python.
- 🔁 **We retry with exponential backoff** on `408 / 429 / 503` and network errors — up to 5 attempts, `Retry-After` honoured.
- 🌐 **We rotate proxies** through Apify Proxy on every retry — fresh session, fresh exit IP.
- 🧱 **We back off when the target rate-limits.** Partial successes surface with a clear status message; we never silently return an empty dataset.
- 🧊 **We keep the dataset clean** — Pydantic-validated rows, ISO-8601 timestamps, stable item IDs.
- 💰 **You pay only for results that land.** No data → no charge, beyond the small `actor-start` warm-up fee.

### 💡 Use cases

- **Resale-arbitrage comps** — check what similar items are currently priced at before buying stock to flip.
- **Sourcing research** — see which brands, sizes, and condition bands are actually listed and at what price.
- **Cross-market pricing** — compare the same keyword's asking prices across the US, UK, German, and French Vinted domains.
- **Demand tracking** — monitor favourite counts as a proxy for listing interest over time.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Set `keywords` to one or more search terms (e.g. `"nike jacket"`).
3. Pick a `domain` — defaults to `vinted.com`.
4. Optionally set `brand`, `size`, `priceFrom`, and `priceTo` to narrow the search.
5. Set `maxItems` — the cap on rows emitted across all keywords combined.
6. Click **Start**. Rows stream into the run's dataset as they're found.
7. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `keywords` | `array` | **yes** | — | One or more free-text search terms, e.g. `"nike jacket"`. Results merge, sharing the `maxItems` budget. |
| `domain` | `string` | no | `vinted.com` | One of `vinted.com`, `vinted.co.uk`, `vinted.de`, `vinted.fr`. |
| `brand` | `string` | no | — | Folded into the search text. |
| `size` | `string` | no | — | Folded into the search text. |
| `priceFrom` / `priceTo` | `number` | no | — | Passed through as catalog query parameters. `priceTo` must be ≥ `priceFrom` when both are set. |
| `maxItems` | `integer` | no | `50` | Cap on rows emitted across all keywords, 1-1000. |
| `proxyConfiguration` | `object` | no | `{"useApifyProxy": true}` | Standard Apify Proxy input. |

#### Example input

```json
{
  "keywords": ["nike jacket"],
  "domain": "vinted.com",
  "maxItems": 50,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📤 Output

One dataset row per matched, visible listing:

| Field | Type | Notes |
|---|---|---|
| `item_id` | `integer` | Vinted's own numeric item ID. |
| `title` | `string` | Listing title. |
| `brand` / `size` | `string \| null` | Seller-set brand and size tags. |
| `price` | `string` | Asking price as a decimal string, e.g. `"12.00"`. |
| `currency` | `string` | ISO 4217 currency code. |
| `status_condition` | `string \| null` | Condition label, e.g. `"Good"` — not a sold flag. |
| `url` | `string` | Canonical Vinted item URL. |
| `photo_url` | `string \| null` | Primary listing photo. |
| `seller_login` | `string \| null` | Seller's Vinted username. |
| `favourite_count` | `integer` | Number of users who favourited the listing. |
| `created_at` | `string \| null` | Always `null` — no confirmed public source for listing creation time. |
| `scraped_at` | `string` | ISO-8601 UTC timestamp for this row. |

#### Example output

```json
{
  "item_id": 9518825280,
  "title": "Free Country jacket",
  "brand": "Free Country",
  "size": "M",
  "price": "12.00",
  "currency": "USD",
  "status_condition": "Good",
  "seller_login": "jane_doe123",
  "favourite_count": 3,
  "created_at": null,
  "url": "https://www.vinted.com/items/9518825280-free-country-jacket",
  "photo_url": "https://images1.vinted.net/t/...",
  "scraped_at": "2026-07-29T12:00:00.000Z"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.01 | One-off warm-up charge per run |
| `item-result` | $0.0025 | Per listing row written to the dataset |

Example: 1 000 results ≈ **$2.51**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

This Actor returns **active, visible listings only** — Vinted's public catalog API exposes no `sold` boolean, so this is price and condition intel for current inventory, not a closed-sale transaction history. `created_at` is always `null` in v1 — no confirmed public source exists for listing creation time. `brand` and `size` filters are folded into the free-text search rather than a dedicated facet lookup, so a narrow combination can under-match versus Vinted's own UI.

### ❓ FAQ

**Does this return sold listings?**

No — Vinted's public catalog API only exposes active/visible listings. There's no `sold` flag in the public wire format, so this Actor returns current asking prices and condition, not closed-sale history.

**Do I need a proxy?**

`proxyConfiguration` defaults to Apify Proxy on. We rotate sessions on every retry to stay ahead of rate limits.

**Which domains are supported?**

`vinted.com`, `vinted.co.uk`, `vinted.de`, and `vinted.fr` — all share the same catalog wire format.

**Why is `created_at` always null?**

No public endpoint reliably returns a per-item creation timestamp for this target. We'd rather ship `null` than fabricate a value.

### 💬 Your feedback

Spotted a bug, a field that doesn't match reality, or a Vinted domain we're missing? Open an issue on the Actor's **Issues** tab on Apify Console — the devil's in the data, and we'd rather fix it than let it slide.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `keywords` (type: `array`):

Free-text search terms, e.g. "nike jacket". One catalog run per keyword; results merged, sharing the Max items budget.

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

Vinted host to search. All four share the same catalog API wire shape.

## `brand` (type: `string`):

Optional brand filter, folded into the search text (e.g. "Nike").

## `size` (type: `string`):

Optional size filter, folded into the search text (e.g. "M").

## `priceFrom` (type: `number`):

Minimum price, passed through as a catalog query parameter.

## `priceTo` (type: `number`):

Maximum price, passed through as a catalog query parameter. Must be >= Price from when both are set.

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

Cap on rows emitted across all keywords combined.

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

Apify Proxy configuration. A WEBSHARE\_PROXY\_URL environment variable, when set, takes priority over this setting. Defaults to the RESIDENTIAL group — Vinted blocks datacenter/auto exits on the very first request.

## Actor input object example

```json
{
  "keywords": [
    "nike jacket"
  ],
  "domain": "vinted.com",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "keywords": [
        "nike jacket"
    ],
    "domain": "vinted.com",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/vinted-listings-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 = {
    "keywords": ["nike jacket"],
    "domain": "vinted.com",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/vinted-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "nike jacket"
  ],
  "domain": "vinted.com",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call devilscrapes/vinted-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devilscrapes/vinted-listings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/UXM0B2OlpVqXUuXAj/builds/fgXk1TbXDLQEZNjU3/openapi.json
