# Vestiaire Collective Real-Time Data Scraper (`b2b_leads/vestiaire-collective-real-time-data-scraper`) Actor

Live Vestiaire Collective resale market data: keyword search, full listing details, seller closets, profiles, and sell-through stats. Results stream to your dataset in real time with price filters, sort options, and webhook delivery.

- **URL**: https://apify.com/b2b\_leads/vestiaire-collective-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 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/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

## Vestiaire Collective Real-Time Data — Live Resale Market Intelligence

**Live Vestiaire Collective market data for designer resale:** keyword listing search, full product details, seller inventory tracking, seller profiles, sell-through stats, and instant deal alerts. Structured JSON streams to your dataset row-by-row while the run is still working — results start appearing in seconds.

> ⚠️ **Free Apify plan notice (read first):** Free-tier accounts are limited to **2 results per run**. Upgrade to any paid Apify plan for unlimited exports. This is a policy limit, not an error — it is stated here, in the Actor input form, and in the run log.

### Who this is for

- **Vintage & thrift resellers** sourcing undervalued designer inventory (Poshmark, eBay, Depop, Mercari, Grailed cross-listers)
- **Consignment owners** tracking competitor closets and market prices
- **Resale arbitrageurs** hunting margin spreads between platforms
- **Fashion market researchers & pricing teams** tracking sell-through and trend data
- **AI agents & automations** that need structured resale market data via the Apify MCP server

### What you can do with it

- **Find undervalued designer & vintage inventory** — search "vintage 90s levis 501", "carhartt detroit jacket", "patagonia fleece", "chanel vintage bag", or "y2k baby tee" and sort by newest first to catch fresh steals before anyone else.
- **Price comps & sell-through analysis** — pull seller sell-through statistics (items listed vs. sold) to gauge realistic pricing and demand before you buy.
- **Seller inventory monitoring** — watch top sellers' full active stock and spot new listings and repricing moves.
- **Instant Slack / Discord deal alerts** — pipe every matched item to a webhook the moment it is saved, so your pricing bot or phone buzzes on newly listed steals.
- **Multi-platform pricing sync** — feed structured rows into Sheets, Airtable, Make, Zapier, n8n, or your own repricer.

### Features

| Feature | What it does | Output (`featureType`) |
|---|---|---|
| 🔍 **Listing Search** | Live keyword search with min/max price filters and sort order | `listing_search` |
| ✨ **Full Details Enrichment** | Streams a second enriched row per search result (description, fabric/material, category path, full image gallery, and more) — filter by `detailsFetched` | `listing_search` (`detailsFetched: true`) |
| 📦 **Listing Details** | Full record for specific listings by URL or listing ID | `listing_details` |
| 👚 **Seller Inventory (Closet Listings)** | Full active inventory of any seller profile | `closet_listings` |
| 👤 **Seller Profile** | Reseller stats: items sold, closet size, followers, verification badges, bio | `seller_profile` |
| 🧾 **Sold Item Comps / History** | Per-seller sell-through statistics for pricing decisions | `sold_history` |
| 🔗 **Scrape By URL** | Direct processing of any Vestiaire Collective URL — search, seller, category, or listing | `scrape_by_url` |

**Sold data note:** this marketplace does not expose a public per-item sold feed. The Sold Comps feature returns the closest available equivalent — per-seller sell-through statistics (items listed, items sold, sell-through rate, shipping speed, quality pass rate) — so you can still gauge demand and price fairly. This is described in the input form too.

**Stream, then enrich:** with **Enrich with full listing details** on, every search result is saved **immediately** as a fast row, and a **second enriched row** (`detailsFetched: true`) follows as soon as its detail page is read. No buffering behind slow items — rows appear in real time, and a timeout can never erase completed work. Keep the last row per `item_id` for fully enriched data, or filter `detailsFetched: true` to work with enriched rows only. Enrichment adds a little extra time per listing.

### Quick start (10 results in seconds)

The Actor comes prefilled for an instant demo run:

1. Click **Start** — no configuration needed.
2. Defaults: Listing Search on, keywords `carhartt detroit jacket`, `vintage 90s levis 501`, `patagonia fleece`, **10 results per keyword**.
3. Watch the dataset fill row-by-row in real time.

#### Example searches that work well

| Goal | Keywords | Filters |
|---|---|---|
| Workwear flips | `carhartt detroit jacket`, `carhartt vest` | max price: 150 |
| Vintage denim | `vintage 90s levis 501`, `levis 550 orange tab` | max price: 90 |
| Gorpcore | `patagonia fleece`, `arc'teryx shell`, `north face nuptse` | sort: price low to high |
| Y2K / streetwear | `y2k baby tee`, `vintage nba jersey`, `stussy 90s` | sort: newest first |
| Designer for cheap | `chanel vintage bag`, `celine macadam` | sort: price low to high |
| Sneakers | `vintage nike air max`, `jordan 1 1985` | max price: 200 |

### Full input reference

#### 🔍 Listing Search (`enableListingSearch`, default **on**)

| Field | Type | Default | Notes |
|---|---|---|---|
| `searchKeywords` | string list | 3 resale examples | Required when search is on. Any marketplace search term. |
| `searchMaxResults` | integer | **10** | Max results per keyword (1–200). |
| `searchSort` | select | `relevance` | `relevance`, `newest` (newest first), `price_low_to_high`, `price_high_to_low`. |
| `searchMinPrice` / `searchMaxPrice` | integer | — | Price window in region currency. Applied as a result filter after collection (the marketplace does not expose price as a search parameter) — items outside the window are skipped before the dataset write. |
| `searchFetchFullDetails` | boolean | `false` | **Enrich with full listing details** — streams a second enriched row per search result (description, fabric/material, category path, full gallery, and more; `detailsFetched: true`). |

#### 📦 Listing Details (`enableListingDetails`, default off)

| Field | Type | Notes |
|---|---|---|
| `listingUrls` | string list | Full listing URLs (`https://www.vestiairecollective.com/...-12345678.shtml`). |
| `listingIds` | string list | Numeric listing IDs (the digits at the end of a listing URL). |

#### 👚 Seller Inventory (`enableClosetListings`, default off)

| Field | Type | Default | Notes |
|---|---|---|---|
| `sellerUsernames` | string list | — | Seller usernames or numeric profile IDs. Shared by Seller Inventory, Seller Profile, and Sold Comps. |
| `sellerMaxListings` | integer | `30` | Max listings per seller (1–500). |

#### 👤 Seller Profile (`enableSellerProfile`, default off)

Uses the same `sellerUsernames` list. One row per seller: items sold, closet size, followers, verification badges, bio, country, shipping speed.

#### 🧾 Sold Item Comps / History (`enableSoldHistory`, default off)

Uses the same `sellerUsernames` list. One row per seller with sell-through statistics (see the sold-data note above).

#### 🔗 Scrape By URL (`enableScrapeByUrl`, default off)

| Field | Type | Notes |
|---|---|---|
| `scrapeUrls` | string list | Any marketplace search URL, seller profile URL, category page, brand feed, or single listing URL. The page type is auto-detected. Non-marketplace URLs are rejected with a clear error. |

#### Run volume

There is no single global cap — each feature section controls its own volume:

- **Listing Search** → `searchMaxResults` (per keyword)
- **Seller Inventory** → `sellerMaxListings` (per seller)
- **Listing Details** & **Scrape By URL** → the number of URLs/IDs you paste

#### 🌍 Region

| Field | Type | Default | Notes |
|---|---|---|---|
| `country` | select | `US` | Market region: `US`, `UK`, `FR`, `DE`, `IT`, `ES`. Controls currency (USD/GBP/EUR) and the recommended proxy country. |

#### 🔔 Delivery

| Field | Type | Default | Notes |
|---|---|---|---|
| `webhookUrl` | string | — | Optional. Every record is always saved to the dataset; each new row is ALSO POSTed here in real time (Slack, Discord, Zapier, Make, n8n, custom bot). |
| `webhookFormat` | select | `json` | `json` = full record object; `slack` = Slack-friendly message. |

### Full output field reference

Every listing row carries the shared core so multi-platform agents can union datasets:
`featureType, scrapedAt, url, item_id, item_url, title, description, main_image_url, additional_image_urls, status, current_price, original_price, currency, discount_percentage, brand, size, condition, category, department, subcategory, color, style_tags, material, likes_count, is_sold, seller_username, seller_id, detailsFetched`.

Feature-specific highlights:

| Group | Fields |
|---|---|
| Pricing | `current_price`, `original_price`, `currency`, `discount_percentage`, `free_shipping`, `accepts_offers` |
| Product | `brand`, `size`, `condition`, `category`, `department`, `subcategory`, `color`, `material`, `style_tags`, `is_vintage`, `is_authentic` |
| Engagement | `likes_count`, `comments_count`, `is_sold`, `position` |
| Seller (listing rows) | `seller_username`, `seller_id`, `seller_location`, `seller_verified` |
| Seller profile rows | `display_name`, `bio`, `followers`, `following`, `total_sales`, `total_listings`, `total_likes`, `country`, `is_trusted`, `usually_ships_within`, `badges`, `avatar_url` |
| Sell-through rows | `items_listed`, `items_sold`, `sell_through_rate`, `usually_ships_within`, `pass_rate`, `note` |
| Scrape By URL rows | `pageType` (`listing` / `seller` / `catalog`) |

Filter any dataset view by `featureType`: `listing_search`, `listing_details`, `closet_listings`, `seller_profile`, `sold_history`, `scrape_by_url`.

### Webhook guide

1. Paste a **webhookUrl** (Slack incoming webhook, Discord webhook, Zapier catch hook, Make scenario, n8n webhook, or your own endpoint).
2. Pick the format: `json` (full record — best for bots and Sheets) or `slack` (formatted message with price, brand, size, seller, and link).
3. Start the Actor. Every saved row is POSTed immediately after the dataset write — deal alerts arrive while the run is still working.
4. Webhook delivery is best-effort: a failed delivery never stops the run and never loses the dataset row.

### MCP / AI agent usage

Add the Actor to any MCP client (Claude, Cursor, …):

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=<your-actor-id>"
```

Then ask questions like:

- "What is the average listing price for a 90s Carhartt Detroit jacket on Vestiaire Collective?"
- "Find me Patagonia fleece under $60 and send new matches to my Slack."
- "Compare sell-through rates between seller X and seller Y."

### FAQ

**Do I need a proxy?** Residential connections are used by default and give the most reliable results at scale. Match the proxy country to the Market region.

**Why do free runs stop at 2 results?** Free Apify plans get a 2-result preview per run. Upgrade to any paid plan for unlimited exports. The run log states this plainly — it is not an error.

**How fresh is the data?** Every row is collected live at run time. Pair the "newest first" sort with a webhook for deal-alert workflows.

**Are there rate limits?** Collection is throttled to polite parallel limits with randomized pauses between chunks, which keeps runs stable and reliable.

**Why does enrichment take longer?** Full detail collection adds a little extra time per listing — but fast rows stream to the dataset the moment each item is discovered, so results appear in real time. Leave "Enrich with full listing details" off for the fastest runs.

**Can I get sold prices per item?** The marketplace has no public per-item sold feed. Sold Comps returns per-seller sell-through statistics instead — the closest available equivalent.

### Free-tier notice

Free Apify plans receive a **2-result preview** per run (configurable by the Actor owner via Console environment variables `FREE_TIER_MAX_ITEMS` and `FREE_TIER_MODE`). Paying users get full, uncapped output. The limit applies to total records per run across all features.

# Actor input Schema

## `enableListingSearch` (type: `boolean`):

Live keyword search across Vestiaire Collective — designer pieces, streetwear, and vintage finds. On by default and prefilled so you can click Start and get results in seconds.

## `searchKeywords` (type: `array`):

One or more search terms, e.g. "vintage 90s levis 501", "carhartt detroit jacket", "patagonia fleece", "chanel vintage bag". Required when Listing Search is on.

## `searchMaxResults` (type: `integer`):

Maximum listings to return for each keyword (1–200). Default 10 — perfect for instant demo runs.

## `searchSort` (type: `string`):

How to order search results. "Newest first" is ideal for deal alerts on fresh inventory.

## `searchMinPrice` (type: `integer`):

Minimum listing price in the selected market currency. Applied after collection as a result filter (the marketplace does not expose this as a search parameter).

## `searchMaxPrice` (type: `integer`):

Maximum listing price — pair with "Newest first" sort to catch underpriced steals fast. Applied after collection as a result filter (the marketplace does not expose this as a search parameter).

## `searchFetchFullDetails` (type: `boolean`):

When on, each search result stays ONE row (featureType listing\_search, detailsFetched=true) but is enriched with description, fabric/material, style tags, full image gallery, and seller shipping discounts. Adds a little extra time per listing. When off, you get fast search cards with price, title, brand, size, and condition. Every discovered item is always saved — never filtered out.

## `enableListingDetails` (type: `boolean`):

Fetch the full record for specific Vestiaire Collective listings by URL or numeric listing ID.

## `listingIds` (type: `array`):

Numeric listing IDs, e.g. 66450862 (the digits at the end of a listing URL).

## `listingUrls` (type: `array`):

Full Vestiaire Collective listing URLs (https://www.vestiairecollective.com/...-12345678.shtml).

## `enableClosetListings` (type: `boolean`):

Collect the full active inventory of any seller profile — track competitor stock and repricing moves.

## `sellerUsernames` (type: `array`):

Vestiaire Collective seller usernames or numeric profile IDs (e.g. sexxxyvintage or 32717740). Shared by Seller Inventory, Seller Profile, and Sell-Through Stats.

## `sellerMaxListings` (type: `integer`):

Maximum active listings to collect per seller (1–500).

## `enableSellerProfile` (type: `boolean`):

Extract reseller stats: items sold, closet size, followers, verification badges, bio, location, and shipping speed.

## `enableSoldHistory` (type: `boolean`):

Per-seller sell-through statistics: items listed, items sold, sell-through rate, shipping speed, and community standing. The marketplace does not expose a public per-item sold feed — this is the closest available equivalent and is what the output contains.

## `enableScrapeByUrl` (type: `boolean`):

Paste any Vestiaire Collective URL — search results, seller profile, category page, brand feed, or single listing.

## `scrapeUrls` (type: `array`):

Any Vestiaire Collective search, seller profile, category, brand, or listing URL.

## `webhookUrl` (type: `string`):

Optional. Every record is always saved to the run dataset — this webhook is an ADDITIONAL real-time push. Each new row is also POSTed to this URL (Slack, Discord, Zapier, Make, n8n, custom pricing bot).

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message payload.

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

Vestiaire Collective market region. Affects currency and the recommended proxy country.

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

Residential proxy recommended. Match the country to the Market region above (US by default).

## Actor input object example

```json
{
  "enableListingSearch": true,
  "searchKeywords": [
    "carhartt detroit jacket",
    "vintage 90s levis 501",
    "patagonia fleece"
  ],
  "searchMaxResults": 10,
  "searchSort": "relevance",
  "searchFetchFullDetails": false,
  "enableListingDetails": false,
  "listingIds": [],
  "listingUrls": [],
  "enableClosetListings": false,
  "sellerUsernames": [],
  "sellerMaxListings": 30,
  "enableSellerProfile": false,
  "enableSoldHistory": false,
  "enableScrapeByUrl": false,
  "scrapeUrls": [
    "https://www.vestiairecollective.com/search/?q=vintage%20carhartt"
  ],
  "webhookUrl": "",
  "webhookFormat": "json",
  "country": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Full dataset for this run (every featureType).

## `overview` (type: `string`):

Core fields across features, including detailsFetched for search rows.

## `search` (type: `string`):

featureType=listing\_search only. One listing = one row; full details are merged when "Enrich with full listing details" is enabled.

## `details` (type: `string`):

featureType=listing\_details — only from the Listing Details feature (specific URLs/IDs), not from search enrichment.

## `closet_listings` (type: `string`):

No description

## `seller_profile` (type: `string`):

No description

## `sold_history` (type: `string`):

No description

## `scrape_by_url` (type: `string`):

No description

# 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 = {
    "enableListingSearch": true,
    "searchKeywords": [
        "carhartt detroit jacket",
        "vintage 90s levis 501",
        "patagonia fleece"
    ],
    "searchMaxResults": 10,
    "searchSort": "relevance",
    "searchFetchFullDetails": false,
    "enableListingDetails": false,
    "listingIds": [],
    "listingUrls": [],
    "enableClosetListings": false,
    "sellerUsernames": [],
    "sellerMaxListings": 30,
    "enableSellerProfile": false,
    "enableSoldHistory": false,
    "enableScrapeByUrl": false,
    "scrapeUrls": [
        "https://www.vestiairecollective.com/search/?q=vintage%20carhartt"
    ],
    "webhookFormat": "json",
    "country": "US",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/vestiaire-collective-real-time-data-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 = {
    "enableListingSearch": True,
    "searchKeywords": [
        "carhartt detroit jacket",
        "vintage 90s levis 501",
        "patagonia fleece",
    ],
    "searchMaxResults": 10,
    "searchSort": "relevance",
    "searchFetchFullDetails": False,
    "enableListingDetails": False,
    "listingIds": [],
    "listingUrls": [],
    "enableClosetListings": False,
    "sellerUsernames": [],
    "sellerMaxListings": 30,
    "enableSellerProfile": False,
    "enableSoldHistory": False,
    "enableScrapeByUrl": False,
    "scrapeUrls": ["https://www.vestiairecollective.com/search/?q=vintage%20carhartt"],
    "webhookFormat": "json",
    "country": "US",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/vestiaire-collective-real-time-data-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 '{
  "enableListingSearch": true,
  "searchKeywords": [
    "carhartt detroit jacket",
    "vintage 90s levis 501",
    "patagonia fleece"
  ],
  "searchMaxResults": 10,
  "searchSort": "relevance",
  "searchFetchFullDetails": false,
  "enableListingDetails": false,
  "listingIds": [],
  "listingUrls": [],
  "enableClosetListings": false,
  "sellerUsernames": [],
  "sellerMaxListings": 30,
  "enableSellerProfile": false,
  "enableSoldHistory": false,
  "enableScrapeByUrl": false,
  "scrapeUrls": [
    "https://www.vestiairecollective.com/search/?q=vintage%20carhartt"
  ],
  "webhookFormat": "json",
  "country": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/vestiaire-collective-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/vestiaire-collective-real-time-data-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/zKSb08DV8BCCF3duY/builds/pGMDtmdmDDXu27gZB/openapi.json
