# Vinted Listings — One Row per Item, $0.0008 Each (`jpmarketdata/vinted-listings`) Actor

Type a keyword and get every current Vinted listing for it on the country site you pick, one row each. Returns title, asking price, buyer-total price, brand, size, condition, favourites and URL. $0.0008 per listing, no start fee; no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/vinted-listings.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 listing returneds

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

## Vinted Listings — One Row per Item, $0.0008 Each

**What it does:** Returns the current Vinted listings for your keyword on one country site, one row per listing, at a flat rate per row.

**You enter:** Keywords, e.g. `nike air max`, a country site (default fr) and how many listings (10–960 per keyword).

**You get:** One row per listing: title, asking price, buyer-total price, currency, brand, size, condition, favourite count, promoted flag, URL, photo; plus how many listings Vinted reports and whether that hit its 960 ceiling.

**Price:** $0.0008 per listing delivered. No start fee, no per-search fee. No results = no charge.

> Unofficial — not affiliated with Vinted. Reads public pages only.

### The price

**$0.0008 per listing delivered. No start fee. No per-search fee. No plan tiers.**

You are charged for the listings that actually land in your dataset and for nothing else — not for the run, not for the search term, not for the pages we had to page through to get there. 1,000 listings cost **$0.80**, whether they come from one search term or ten, and whether we fetched 1,000 rows or 1,600 to find them.

That is the entire pitch. This Actor sells the same raw catalog feed the other Vinted scrapers sell — cheaper, and with the metadata that tells you what the feed is not showing you.

### What you get, per listing

| field | what it is |
|---|---|
| `id`, `title`, `url`, `thumbnail` | the listing itself |
| `price` | what the seller asks — the number on the search page |
| `totalItemPrice` | what the buyer pays: asking price **+ Buyer Protection** (measured affine, about `0.70 + 5%`) |
| `currency` | decided by the country site, not guessed |
| `brand`, `size`, `condition` | as Vinted publishes them; `condition` is localized by marketplace and is **not** translated |
| `favouriteCount` | how many people saved it |
| `promoted` | `true` if it is a paid placement — see below |
| `totalFound`, `totalFoundCapped`, `totalFoundCap` | how many Vinted claims to have, and whether that number is a ceiling |
| `listingsReturned`, `duplicatesDropped`, `promotedExcluded` | what this run delivered and what it dropped |
| `sourceUrl`, `keyword`, `domain`, `scrapedAt` | the search these listings came from |

Both prices are coerced to numbers. Vinted serves them as strings (`"32.0"`), and a feed that passes them through as text sorts `"9.0"` above `"40.0"` in every spreadsheet that opens it.

### Three things this feed will tell you that a raw dump will not

**1. `totalFound` saturates at 960 — it is a ceiling, not a count.** Vinted stops counting and stops paging at 10 pages of 96; page 11 is an HTTP 400. `nike air max` reports 960 and so does `chanel`, while `leica m6` reports 218. When `totalFoundCapped` is `true`, the real number of matching listings is **unknown and larger**, and what you have is the first pages by relevance rather than a random draw from the market. 960 is also the hard maximum this Actor (or any Vinted scraper) can return for one search term — to go deeper, split the search with `priceMin` / `priceMax`.

**2. Promoted listings are flagged, not hidden.** Measured 2026-08-10 over all 880 distinct `nike air max` listings on vinted.fr: promoted listings ask a median of **EUR 40** (n=281) against an organic median of **EUR 20** (n=599) — and they are front-loaded, 66% of the first three relevance pages against 32% over all ten. Every record carries `promoted: true/false` so you can separate them yourself. Set `includePromoted: false` and they are dropped instead — the Actor then **pages deeper to make the shortfall up**, so you still get the number of listings you asked for, and `promotedExcluded` tells you how many were removed.

**3. Duplicates are removed and counted.** The same listing comes back on several pages — roughly 80 per 960 fetched. They are deduplicated by id, counted in `duplicatesDropped`, and **billed once**.

`view_count` exists on Vinted's catalog response and is **always 0** (measured over ~1,800 items across seven searches and two country sites). It is not emitted. A column of zeroes you paid for is worse than no column.

### Seller identities are never emitted

Vinted's catalog response includes a `user` block — seller id, login and profile URL. **This Actor drops it, always, and there is no input that turns it back on.** Other scrapers hand it to you; we take the view that a public listing is public and a person behind it is not. If your use case needs seller identity, this is deliberately the wrong tool.

### Input

```json
{
  "keywords": ["nike air max", "levis 501"],
  "domain": "fr",
  "maxListings": 300,
  "priceMin": 20,
  "includePromoted": false
}
```

- **`keywords`** — one or more search terms. Duplicated terms are searched once.
- **`domain`** — the country site, which decides **both the marketplace and the currency**: `com` (USD), `fr` / `de` / `es` / `it` / `nl` (EUR), `co.uk` (GBP), `pl` (PLN). One run is one country.
- **`maxListings`** — per search term, 10 to 960. `maxListings: 300` with two keywords bills 600 listings, i.e. $0.48.
- **`priceMin` / `priceMax`** — in the country site's own currency. These are **pushed to Vinted**, not filtered afterwards, so you are never billed for listings that were fetched only to be thrown away.
- **`includePromoted`** — `true` (default) returns paid placements flagged; `false` drops and counts them.

Results come back in Vinted's own relevance order, which is sent explicitly on every page.

### Limits worth knowing before you buy

- **Live listings only.** Vinted's catalog serves unsold items, so these are asking prices. There is no sold-price data on Vinted to scrape, buy or infer.
- **960 per search term is the wall**, for everyone. See above.
- **A keyword is not a product.** `nike air max` returns tracksuits, leggings and bags alongside shoes. Bound the tier with `priceMin` / `priceMax` if that matters.
- **`condition` is localized** ("Très bon état" / "Sehr gut" / "Very good"). Translating it into a shared scale across eight countries would be a claim we cannot back.
- Read-only public data, anonymous session, throttled (~1.5s between pages), no browser, 256 MB.

### If every search fails

The run **fails loudly** with the reason. It never finishes green with an empty dataset — a silent success is the one outcome you cannot detect from the outside, so it is the one we refuse to produce.

### If something goes wrong

- **Wrong number or a failed run?** Open a ticket on the **Issues** tab. I read every one and reply within 2 business days (Japan time).
- **You never get a fake "empty" result.** If the site can't be read, the run fails and says so.
- **No results = no charge.** You only pay for results you actually get.
- **Checked every week.** An automatic test runs this tool weekly; if the site changes, I fix it.
- **Public pages only.** No login, no personal data, and it goes easy on the site.

### More tools by the same author

- [Vinted Prices by Country — Cheapest vs Priciest Site](https://apify.com/jpmarketdata/vinted-cross-country-price-gap)
- [Vinted Asking Prices — Median, Range & Favourites](https://apify.com/jpmarketdata/vinted-price-checker)
- [Vinted Underpriced Listings — Cheap and Most Favourited](https://apify.com/jpmarketdata/vinted-underpriced-deals)
- [AutoScout24 Listings — One Row per Car, $0.0006 Each](https://apify.com/jpmarketdata/autoscout24-listings)
- [AutoScout24 Used Car Prices by Model — Median & Range](https://apify.com/jpmarketdata/autoscout24-price-market-checker)
- [AutoScout24 Underpriced Cars — Discount vs Model Median](https://apify.com/jpmarketdata/autoscout24-underpriced-deals)

All tools (Japan marketplaces, real estate, jobs, racing, prediction markets): <https://apify.com/jpmarketdata>

### Disclaimer

Unofficial, independent tool — **not affiliated with, endorsed by, or sponsored by Vinted**. Product names and logos belong to their owners and only say where the data comes from. Data is read from public pages, for market research; check before you act on it.

# Actor input Schema

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

What to search for on Vinted.

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

The domain decides both the marketplace and the currency.

## `maxListings` (type: `integer`):

How many listings to return per search term. Vinted stops paging at 960 results.

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

Pushed to Vinted, in the country site's own currency.

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

Pushed to Vinted, like the minimum.

## `includePromoted` (type: `boolean`):

Promoted listings are priced about twice the organic median, so they are flagged either way. Turn this off to exclude them.

## Actor input object example

```json
{
  "keywords": [
    "nike air max"
  ],
  "domain": "fr",
  "maxListings": 100,
  "includePromoted": true
}
```

# 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 air max"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/vinted-listings").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 air max"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/vinted-listings").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 '{
  "keywords": [
    "nike air max"
  ]
}' |
apify call jpmarketdata/vinted-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/vinted-listings"
        }
    }
}

```

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/tJXLcUNFEZmikOVGC/builds/4SVCt18UWCwkaxk3P/openapi.json
