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

Type one keyword or a list and get Vinted listings from the country site you pick, one row each — up to 960 per keyword, where the site stops paging. Returns title, asking price, buyer-total price, brand, size, condition, favourites and URL. $0.0008 per listing; 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/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 Listings — One Row per Item, $0.0008 Each

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

**You enter:** Keywords, one or a list, e.g. `nike air max`; country (default fr); rows per keyword (100, max 960).

**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, and the count is per keyword — two keywords at 300 bill 600. Nothing else is charged. No results = no charge.

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

### The price

**$0.0008 per listing returned. Nothing else is charged.** You pay per listing, not per run, not per search term and not per month.

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

Alongside the listings you get the numbers that say what the results are *not* showing you: how many listings Vinted claims to have, whether that number is a ceiling, how many paid placements were dropped, and how many repeats were removed.

### 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 |
| `sellerId`, `sellerLogin`, `sellerProfileUrl` | who is selling, as shown on the listing (no profile photo) — see below |
| `totalFound`, `totalFoundCapped`, `totalFoundCap` | how many Vinted claims to have, and whether that number is a ceiling |
| `listingsReturned`, `duplicatesDropped`, `promotedExcluded`, `promotedIncluded` | what this run delivered, what it dropped, and whether paid placements were kept |
| `sourceUrl`, `keyword`, `domain`, `scrapedAt` | the search these listings came from |

Both prices are turned into numbers. Vinted serves them as text (`"32.0"`), and results that pass them through as text sort `"9.0"` above `"40.0"` in every spreadsheet that opens them.

One row, measured on 2026-08-10 (real run):

```json
{
  "type": "listing",
  "keyword": "nike air max",
  "domain": "vinted.fr",
  "id": 9613337723,
  "title": "Nike air Max golf",
  "price": 80.0,
  "totalItemPrice": 84.7,
  "currency": "EUR",
  "brand": "Nike Air",
  "size": "42",
  "condition": "Neuf sans étiquette",
  "favouriteCount": 8,
  "promoted": false,
  "url": "https://www.vinted.fr/items/9613337723-nike-air-max-golf",
  "thumbnail": "https://images1.vinted.net/t/06_01083_yFMo3BgaN3Xek8JWbGFNDnPP/f800/1786268508.jpeg?s=2f8ec31a8403187f0bcb3432c5a94ddd7644a15b",
  "sellerId": 11084876,
  "sellerLogin": "forget.claire",
  "sellerProfileUrl": "https://www.vinted.fr/member/11084876-forgetclaire",
  "totalFound": 960,
  "totalFoundCapped": true,
  "totalFoundCap": 960,
  "listingsReturned": 60,
  "duplicatesDropped": 0,
  "promotedExcluded": 0,
  "promotedIncluded": true,
  "sourceUrl": "https://www.vinted.fr/catalog?search_text=nike+air+max",
  "scrapedAt": "2026-08-10T04:16:37.506609+00:00"
}
```

### 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 other tool, 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 read. They are removed 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.

### What you get about the seller

Vinted's catalog response includes a `user` block. The fields Vinted itself shows on the public listing are passed through — `sellerId`, `sellerLogin` and `sellerProfileUrl`. The seller's **profile photo is always dropped**: it is a face, and it is not needed to know who is selling.

### 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 **sent to Vinted with the search**, not applied afterwards, so you are never billed for listings that were read 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. Vinted publishes no sold prices anywhere, so nobody can give you them.
- **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.

### A whole list in one run

`keywords` takes a list; each keyword returns up to 960 rows at $0.0008, and only delivered rows are charged.

Two limits for big pulls: the platform stops a run when it reaches its **Maximum cost per run** setting (default $3.00 = 3,750 rows), and the run's default time limit is 300 seconds. Both can be raised in the run options — or split the keywords across runs.

### If a keyword finds nothing, and if every search fails

**A keyword with no listings gets a free row, not silence.** It is a `type: "search_summary"` row carrying `keyword`, `domain`, `totalFound: 0`, `pushed: 0`, the `excluded` counts, a `keywordStatus` (`not_found` — nothing matches that spelling; `promoted_only` — everything found was a promoted placement and promoted listings are turned off; `unknown` — Vinted reported listings and returned none) and a one-line `hint`. Measured 2026-08-18 on vinted.com: `zzzqqxnotarealproduct` finds 0 while `camera` finds 960. The row is never charged — you pay per listing row, and this is not one.

**If every search fails**, the run **fails loudly** with the reason. A search that could not be read is never passed off as an empty result — 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
}
```

# Actor output Schema

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

One row per listing: title, asking price and buyer total, brand, size, condition, favourites, whether it is a paid placement, the link and photo, and the public seller name — with how many listings Vinted reports for the search on every row.

# 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/ttvzutNi0Z5wQnORA/openapi.json
