# Vinted Secondhand Listings, Closets & Seller Feedback (`vexaloom-labs/vinted-secondhand-listings-closets-and-seller`) Actor

Search Vinted secondhand fashion listings by keyword, brand, size, color, material and price across 19 storefronts, or pull a seller's closet, a brand's catalog, or a seller's feedback history.

- **URL**: https://apify.com/vexaloom-labs/vinted-secondhand-listings-closets-and-seller.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Vinted Secondhand Listings, Closets & Seller Feedback

Vinted is a large second-hand fashion marketplace spread across country storefronts. This actor turns its public listings, item pages, seller profiles, closets, feedback history, brands and categories into clean dataset rows across 27 markets. Search by keyword with Vinted's own filters, paste filtered URLs, open full item details, or vet a seller before buying. No account, cookies or proxy setup is needed.

### What this actor does

- **Seven modes:** `search`, `byUrl`, `byUser`, `byBrand`, `byCatalog`, `byBrandSearch`, `byUserFeedbacks`
- **27 markets:** United States, United Kingdom, France, Germany, Italy, Spain, Poland, Czechia, Netherlands, Lithuania, Luxembourg, Austria, Belgium, Portugal, Romania, Slovakia, Finland, Sweden, Greece, Denmark, Estonia, Croatia, Hungary, Ireland, Latvia, Slovenia and Australia
- **Search filters:** keyword, brand, category, size, colour, condition, material, price range and sort order, combinable in one search
- **Deep search:** split a broad search into price bands to collect beyond Vinted's 960-result ceiling per query
- **Optional item details:** description, colour, material, category path, condition ID, upload age, every photo and seller rating
- **Optional seller stats:** rating, feedback counts, live and sold item counts, followers, business/shop identity
- **Seller feedback:** full review history with rating, text, reviewer and optional owner reply
- **Best-effort enrichment:** item details and seller stats are optional; under Vinted rate limits those fields can be omitted or delayed while the search rows still return
- **Empty fields are omitted** — every value in a row is real; fields Vinted does not expose are absent, not filled with placeholders

### Output per item

- `itemId`, `title`, `description`
- `brandTitle`, `brandId`, `brandUrl`
- `sizeTitle`, `sizeId`, `sizeEquivalents`
- `status` (condition as shown on the storefront), `condition` (English), `conditionId`, `statusId`
- `color`, `colors`, `materials`, `otherAttributes`
- `catalogId`, `categoryName`, `categoryPath`
- `priceAmount`, `priceCurrency`, `totalPriceAmount`, `serviceFeeAmount`, `shippingAmount`, `freeShipping`
- `favouriteCount`, `isPromoted`, `isReserved`, `isClosed`, `isHidden`, `isVisible`, `availability`
- `uploadedAgo` — Vinted's relative posting age (e.g. "2 hours ago")
- `itemUrl`, `canonicalUrl`, `imageUrl`, `photos[]`, `photoCount`
- `sellerId`, `sellerLogin`, `sellerCountryCode`, `sellerProfileUrl`, `sellerAvatarUrl`
- `sellerRating`, `sellerFeedbackCount`, `sellerFeedbackReputation`
- `sellerPositiveFeedbackCount`, `sellerNeutralFeedbackCount`, `sellerNegativeFeedbackCount`
- `sellerItemCount`, `sellerSoldItemCount`, `sellerBoughtItemCount`, `sellerFollowersCount`
- `sellerIsBusiness`, `sellerIsOnline`, `sellerBadges`
- `sellerShopName`, `sellerShopLegalName`, `sellerShopVatNumber`, `sellerShopCountry`, `sellerShop`
- `sourceUrl` when an item came from a pasted URL
- `recordType`, `scrapedAt`, `siteName`, `sourceCountry`, `sourceCountryCode`

Fields marked optional above appear only when the selected mode enriches the row or Vinted supplies them.

### Output per seller profile

- `userId`, `login`, `realName`, `about`, `city`, `countryCode`, `countryTitle`, `countryId`
- `avatarUrl`, `avatarThumbnailUrl`, `profileUrl`
- `rating` (0–5), `feedbackCount`, `feedbackReputation`, `feedbackRating`
- `positiveFeedbackCount`, `negativeFeedbackCount`, `neutralFeedbackCount`
- `itemCount`, `totalItemsCount`, `soldItemCount`, `boughtItemCount`
- `followersCount`, `followingCount`
- `isBusiness`, `isOnHoliday`, `isOnline`, `verifications`
- `shop` — name, legal name/code, VAT number, registrar, country, address and verification state for business sellers
- `lastLoggedOn`, `recordType`, `scrapedAt`, `siteName`, `sourceCountry`, `sourceCountryCode`

One profile row is written before that seller's closet items.

### Output per feedback entry

- `feedbackId`, `feedbackText`, `rating`, `createdAt`
- `itemId`, `itemUrl`
- `feedbackUserId`, `reviewerId`, `reviewerLogin`, `reviewerProfileUrl`
- `isSystem`, `isAutomatic`, `feedbackType` (`member` or `automatic`)
- `ownerComment`, `ownerLogin`
- `recordType`, `scrapedAt`, `siteName`, `sourceCountry`, `sourceCountryCode`

### Output per brand

- `brandId`, `title`, `slug`
- `favouriteCount`, `itemCount`, `currency`
- `isVisibleInListings`, `requiresAuthenticityCheck`, `isLuxury`, `isHighValue`
- `brandUrl`, `canonicalUrl`
- `recordType`, `scrapedAt`, `siteName`, `sourceCountry`, `sourceCountryCode`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search`, `byUrl`, `byUser`, `byBrand`, `byCatalog`, `byBrandSearch` or `byUserFeedbacks` |
| `country` | string | `com` | Market suffix, e.g. `com`, `co.uk`, `fr`, `de`, `pl` |
| `searchText` | string | – | Keyword (mode=search) |
| `order` | string | `relevance` | `relevance`, `newest_first`, `price_low_to_high`, `price_high_to_low` |
| `urls` | array | – | Item, member, brand, catalog or filtered search URLs (mode=byUrl) |
| `userId` | string | – | Numeric user ID, username or member URL (mode=byUser / byUserFeedbacks) |
| `brandId` | string | – | Brand ID or brand URL (mode=byBrand) |
| `catalogId` | string | – | Category ID or catalog URL (mode=byCatalog) |
| `brandKeyword` | string | – | Brand registry keyword (mode=byBrandSearch) |
| `brandIds` | array | – | Brand ID filters |
| `catalogIds` | array | – | Category ID filters |
| `sizeIds` | array | – | Size ID filters |
| `color` | string | `any` | Vinted colour ID; the dropdown shows labels such as Black, Gray, White, Cream, Beige, Red, Blue, Green, Brown, Yellow, Silver, Gold and Multi |
| `materialIds` | array | – | Material ID filters |
| `condition` | string | `any` | `new_with_tags`, `new_without_tags`, `very_good`, `good`, `satisfactory` |
| `priceFrom` / `priceTo` | integer | – | Price range in the market's local currency |
| `deepSearch` | boolean | `false` | Split broad searches into price bands past 960 results; a saturated single-price band is treated as truncated |
| `includeItemDetails` | boolean | `false` | Add description, attributes, all photos and seller rating from item pages |
| `includeSellerStats` | boolean | `false` | Add seller rating, counts, followers and shop identity |
| `minRating` | number | – | Drop items below this seller rating (0–5); items without a rating pass |
| `containsKeyword` | string | – | Keep items whose title or description contains this text |
| `maxItems` | integer | `50` | Hard cap (1–5000) |
| `feedbackType` | string | `all` | `all`, `member` or `automatic` (mode=byUserFeedbacks) |

#### Example: search a brand with filters

```json
{
  "mode": "search",
  "country": "fr",
  "searchText": "nike air max",
  "brandIds": ["53"],
  "sizeIds": ["207"],
  "condition": "very_good",
  "priceFrom": 20,
  "priceTo": 80,
  "maxItems": 100
}
```

#### Example: item details and seller stats

```json
{
  "mode": "search",
  "country": "de",
  "searchText": "carhartt jacket",
  "includeItemDetails": true,
  "includeSellerStats": true,
  "maxItems": 25
}
```

#### Example: a seller's profile, closet and feedback

```json
{
  "mode": "byUrl",
  "country": "co.uk",
  "urls": [
    "https://www.vinted.co.uk/member/123456789-seller-name"
  ],
  "maxItems": 50
}
```

```json
{
  "mode": "byUserFeedbacks",
  "country": "fr",
  "userId": "123456789",
  "feedbackType": "member",
  "maxItems": 100
}
```

#### Example: deep search past 960 results

```json
{
  "mode": "search",
  "country": "pl",
  "searchText": "nike",
  "deepSearch": true,
  "maxItems": 3000
}
```

### Use cases

- **Resale sourcing** — scan a brand, size or category for underpriced listings before they sell
- **Price monitoring** — track asking prices and buyer-protection totals across markets over time
- **Seller vetting** — pull a seller's rating, sold count, feedback history, followers and shop identity
- **Market research** — measure listing volume, condition mix and price bands for a brand or category
- **Closet monitoring** — schedule a seller's closet to spot new stock as it appears
- **Brand and category discovery** — resolve Vinted brand IDs and category paths for saved searches

### FAQ

**Do I need a Vinted account or cookies?**
No. Every mode reads publicly available Vinted pages and endpoints. No login, API key or cookie setup is required.

**How many markets are supported?**
27 live Vinted markets, each with its own currency and storefront language. Use the `country` dropdown; pasted URLs use their own domain.

**How many results can I get?**
Vinted returns at most 960 results per query. Turn on `deepSearch` to split a broad query into price bands and collect beyond that ceiling. If a single price point still has more than 960 matches, that band cannot be fully enumerated and is treated as truncated, so deep coverage is broader than 960 but not exhaustive. Closets are capped by Vinted at 10,000 visible items per seller.

**Why is the posting date relative instead of an exact timestamp?**
Vinted stopped exposing an exact listing creation time. The actor returns the relative `uploadedAgo` value the site shows and does not invent a date. View counts are no longer public either, so neither field is fabricated.

**Why do some items lack a brand, material, colour, description or seller rating?**
Sellers can leave optional fields blank, and new sellers have no feedback yet. Item-page and seller-stat enrichment is best-effort: if Vinted rate-limits those routes, the row keeps its search fields and omits the enrichment fields instead of inventing values. Seller-stat enrichment stops after repeated API failures, so a rate-limited run can take several minutes and finish with fewer seller counts. Optional fields are omitted rather than filled with a placeholder.

**Why is `status` in a local language while `condition` is in English?**
Vinted localizes condition names per market. `status` keeps the storefront wording, while `condition` and `conditionId` provide a stable cross-market equivalent. The ID is the reliable key for filtering.

**Can I scrape sold listings or sold prices?**
No. Vinted removes sold listings from public search and exposes no complete sold feed. Seller `soldItemCount` and review rows with an item ID are useful sale signals, but they are not a sold-price history.

**Do the same listings appear in several markets?**
Some markets share one inventory pool and show the same item at converted prices. Match rows by `itemId`; a price difference between markets is often currency conversion, not a separate listing.

**Do images open without authentication?**
Yes. Image URLs are public and load without cookies or a referrer.

**Is this affiliated with Vinted?**
No. This is an independent third-party actor that reads publicly accessible marketplace data. It is not affiliated with or endorsed by Vinted.

# Actor input Schema

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

search: keyword/filters → items. byUrl: explicit Vinted item, member, brand, catalog or search URLs. byUser: profile + closet. byBrand / byCatalog: listings for a brand or category. byBrandSearch: brand registry. byUserFeedbacks: seller reviews.

## `country` (type: `string`):

Vinted market to query. The market controls currency, language and local inventory.

## `searchText` (type: `string`):

Free-text keyword. Leave empty with a brand/category filter to browse. A bare run defaults to adidas.

## `order` (type: `string`):

Result ordering for item searches.

## `urls` (type: `array`):

Item, member, brand, catalog or filtered search URLs. Mixed country domains are supported.

## `userId` (type: `string`):

Numeric Vinted user ID, username, or member URL.

## `brandId` (type: `string`):

Numeric brand ID or brand URL. Discover IDs with Search brand registry.

## `catalogId` (type: `string`):

Numeric category ID or /catalog/<id>-slug URL.

## `brandKeyword` (type: `string`):

Keyword to search the Vinted brand registry.

## `brandIds` (type: `array`):

Numeric brand IDs, e.g. \[53] for Nike.

## `catalogIds` (type: `array`):

Numeric category IDs, e.g. \[1904] for Women.

## `sizeIds` (type: `array`):

Numeric Vinted size IDs. Use the size facet shown on a Vinted search URL.

## `color` (type: `string`):

Single colour filter. Choose any to leave it unfiltered.

## `materialIds` (type: `array`):

Numeric material IDs from Vinted's Material facet (e.g. 44 = Cotton).

## `condition` (type: `string`):

Vinted condition. Choose any to leave it unfiltered.

## `priceFrom` (type: `integer`):

Minimum price in the market's local currency.

## `priceTo` (type: `integer`):

Maximum price in the market's local currency.

## `deepSearch` (type: `boolean`):

Vinted returns at most 960 results per query. Deep search splits the query into price bands so it can collect more (more requests, slower).

## `includeItemDetails` (type: `boolean`):

Open each item page for description, colour, material, category, condition ID, upload age, all photos and seller rating. One extra request per item.

## `includeSellerStats` (type: `boolean`):

Add seller rating, feedback count, item/sold counts, followers and shop identity (one profile request per distinct seller).

## `minRating` (type: `number`):

Drop items whose seller rating is below this value (0–5). Items without a rating pass through. Automatically enables seller stats.

## `containsKeyword` (type: `string`):

Drop items whose title or description does not contain this keyword (case-insensitive). Without item details only the title is searched.

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

Hard cap on emitted records. Values above 960 need deep search.

## `feedbackType` (type: `string`):

All reviews, member-written reviews, or Vinted's automatic sale-completion entries.

## Actor input object example

```json
{
  "mode": "search",
  "country": "com",
  "searchText": "adidas",
  "order": "relevance",
  "urls": [],
  "brandIds": [],
  "catalogIds": [],
  "sizeIds": [],
  "color": "any",
  "materialIds": [],
  "condition": "any",
  "deepSearch": false,
  "includeItemDetails": false,
  "includeSellerStats": false,
  "maxItems": 1,
  "feedbackType": "all"
}
```

# Actor output Schema

## `items` (type: `string`):

Dataset containing all scraped Vinted item, user, brand and feedback records.

# 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",
    "country": "com",
    "searchText": "adidas",
    "order": "relevance",
    "urls": [],
    "brandIds": [],
    "catalogIds": [],
    "sizeIds": [],
    "color": "any",
    "materialIds": [],
    "condition": "any",
    "deepSearch": false,
    "includeItemDetails": false,
    "includeSellerStats": false,
    "maxItems": 1,
    "feedbackType": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/vinted-secondhand-listings-closets-and-seller").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",
    "country": "com",
    "searchText": "adidas",
    "order": "relevance",
    "urls": [],
    "brandIds": [],
    "catalogIds": [],
    "sizeIds": [],
    "color": "any",
    "materialIds": [],
    "condition": "any",
    "deepSearch": False,
    "includeItemDetails": False,
    "includeSellerStats": False,
    "maxItems": 1,
    "feedbackType": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/vinted-secondhand-listings-closets-and-seller").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",
  "country": "com",
  "searchText": "adidas",
  "order": "relevance",
  "urls": [],
  "brandIds": [],
  "catalogIds": [],
  "sizeIds": [],
  "color": "any",
  "materialIds": [],
  "condition": "any",
  "deepSearch": false,
  "includeItemDetails": false,
  "includeSellerStats": false,
  "maxItems": 1,
  "feedbackType": "all"
}' |
apify call vexaloom-labs/vinted-secondhand-listings-closets-and-seller --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/vinted-secondhand-listings-closets-and-seller"
        }
    }
}
```

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/MXkFfooETidynP1xR/builds/mBEPDeegiIM7YP28R/openapi.json
