# Vestiaire Collective Scraper: Sold Items & Seller Intelligence (`kazkn/vestiaire-collective-smart-scraper`) Actor

Scrape public Vestiaire Collective live and sold listings across 70 markets. Extract prices, seller countries, conditions, product details, price history, and duplicate/suspicious seller signals.

- **URL**: https://apify.com/kazkn/vestiaire-collective-smart-scraper.md
- **Developed by:** [KazKN](https://apify.com/kazkn) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $16.00 / 1,000 listing results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Vestiaire Collective Sold Items, Price Tracker & Seller Intelligence

Track public Vestiaire Collective listings across all supported market countries, sold-search results, sold-items pages, public price changes, seller-level benchmarks, and conservative duplicate risk signals.

This Actor is built for resale pricing research, sourcing workflows, seller benchmarking, and recurring watchlists. It uses public data only, supports separate market-country and seller-country filtering, and keeps durable tracking state between runs so repeated schedules can detect price changes and listings that move from active to missing or likely sold.

### What You Can Extract

- Live listing records from search terms and public Vestiaire start URLs.
- Searches across all 70 supported Vestiaire countries by default, or selected markets only.
- Seller/item country filtering with `sellerCountries`, independent from searched markets.
- Item condition filtering with Vestiaire condition IDs.
- Optional title/model precision filtering with `requiredKeywords`.
- Product detail enrichment from public product pages.
- Sold item records from Vestiaire's public sold search filter and public sold-items pages.
- Public price history and `likely_sold` tracking across repeated runs.
- Tracking records that preserve seller metadata when known and respect seller-country filters.
- Seller summary records from observed listings and sold items.
- Duplicate/risk signal records from descriptive public-record similarity.
- Automatic deduplication when the same listing appears across several markets.
- Diagnostic records when public requests fail before any records are collected.
- Dataset views for listings, sold items, price history, seller summaries, risk signals, and run diagnostics.

### How To Run

1. Add one or more `searchTerms`, or add public Vestiaire `startUrls`.
2. Leave `countries` as `["ALL"]` to search every supported Vestiaire market, or pass explicit codes such as `["FR", "US", "GB"]`.
3. Leave `sellerCountries` as `["ALL"]` to include every seller location, or pass explicit seller/item country codes such as `["FR", "IT"]`.
4. Optionally set `itemConditions` to restrict results by Vestiaire item condition.
5. Optionally set `requiredKeywords` when the search query is too broad, for example `["classic flap"]` to exclude Trendy CC Flap results.
6. Set `maxListings` for the number of listing-like records to collect, and `maxDatasetRecords` for the total dataset rows to push.
7. Enable `includeDetails`, `includeSellerInfo`, `includeDuplicateSignals`, or `includeSoldItems` depending on the records you need.
8. Schedule repeat runs with the same `trackingStoreName` to build price history and likely-sold tracking over time.

Dataset results can be exported from Apify as JSON, CSV, Excel, or consumed through the Apify API.

### Reading The Output

Every dataset row includes `recordType`, `displayStatus`, `isSold`, `itemSummary`, and `priceText`.

- `recordType` tells you what the row is: `listing`, `detail`, `sold_item`, `seller_summary`, `risk_signal`, or diagnostic data.
- `displayStatus` and `isSold` make active vs sold records clear in the Apify table.
- `itemSummary` is a compact human-readable line for quick review.
- `country` is the searched Vestiaire market/locale. `sellerCountry` is the seller or item location returned by Vestiaire.
- `condition` is the item condition returned by Vestiaire when available. `conditionFilter` shows the selected condition filter, and `conditionSource` explains whether the condition came from Vestiaire or from the selected filter fallback.
- Apify dataset views select columns; they do not filter rows. For sold analysis, filter exported data or API results with `recordType === "sold_item"` and `isSold === true`.
- `OUTPUT` includes `maxListings`, `maxDatasetRecords`, `listingRecordsCollected`, `duplicateRecordsSkipped`, `sellerCountryRecordsSkipped`, and `precisionRecordsSkipped` so runs are easier to debug.

### Country Selection

`countries` is optional.

- Omit `countries`, pass `[]`, or pass `["ALL"]` to search all 70 supported Vestiaire countries.
- Pass explicit country codes such as `["FR", "US", "GB"]` to restrict the run.
- `countries` controls the Vestiaire market/locale searched. It is not the same as seller location.
- `sellerCountries` controls the seller/item location shown in `sellerCountry`.
- Omit `sellerCountries`, pass `[]`, or pass `["ALL"]` to include every seller country.
- Pass explicit seller country codes such as `["FR"]` to keep only those sellers.
- Do not combine `ALL` with explicit country codes.
- Unknown country codes are rejected.
- `startUrls` can point to any valid public Vestiaire Collective URL regardless of selected countries.
- Duplicate active listings returned by several markets are deduplicated by `listingId`.
- When the same seller-country filter is active, historical tracking records with unknown seller country are skipped instead of being emitted as `sellerCountry: null`.

Supported Vestiaire countries: `AD`, `AU`, `AT`, `BH`, `BE`, `BR`, `BG`, `CA`, `IC`, `CN`, `HR`, `CY`, `CZ`, `DK`, `EE`, `FI`, `FR`, `GF`, `PF`, `DE`, `GI`, `GR`, `GP`, `GG`, `HK`, `HU`, `ID`, `IE`, `IM`, `IL`, `IT`, `JP`, `JE`, `KW`, `LV`, `LB`, `LI`, `LT`, `LU`, `MY`, `MT`, `MQ`, `YT`, `MC`, `NL`, `NC`, `NZ`, `NO`, `PH`, `PL`, `PT`, `QA`, `RE`, `RO`, `SA`, `SG`, `SK`, `SI`, `ZA`, `KR`, `ES`, `BL`, `MF`, `SE`, `CH`, `TW`, `TH`, `AE`, `GB`, `US`.

Currency note: some selected countries use a supported Vestiaire display currency such as EUR or USD when the local currency returns zero-price records from Vestiaire's public search API.

### Item Condition Filter

`itemConditions` is optional.

- Omit `itemConditions` or pass `[]` to include every item condition.
- Pass one or more Vestiaire condition IDs to restrict active searches and sold-search collection.
- Supported values: `1` = Jamais porté avec étiquette, `2` = Jamais porté, `3` = Très bon état, `4` = Bon état, `5` = Correct.
- When Vestiaire does not return a condition but exactly one condition filter was selected, the Actor uses that selected condition as a conservative fallback and marks `conditionSource` as `selected_filter`.
- When multiple condition filters are selected, `conditionFilter` keeps the selected labels and `conditionSource` can be `multi_selected_filter` if Vestiaire does not return a precise condition.

### Precision Filter

`requiredKeywords` is optional.

- Leave `requiredKeywords` empty to keep all results returned by Vestiaire for the search query.
- Add one or more words or phrases to require them in the public `title` or `model`.
- All required keywords must match. `["classic flap"]` keeps `Chanel Classic Flap handbag` and removes `Chanel Trendy CC Flap handbag`.
- Matching is case-insensitive and accent-insensitive.

### Run Limits

- `maxListings` limits listing-like records: `listing`, `sold_item`, and tracking rows.
- `maxDatasetRecords` limits total dataset rows pushed, including product `detail`, `seller_summary`, `risk_signal`, and diagnostics.
- `maxItems` is still accepted for backward compatibility as an alias of `maxDatasetRecords`. If `maxDatasetRecords` is set, it wins.
- With `countries: ["ALL"]`, every country/requête combination gets at least a one-listing search budget while the global `maxListings` cap still controls total output.
- If `includeDetails`, `includeSellerInfo`, or `includeDuplicateSignals` is enabled, set `maxDatasetRecords` higher than `maxListings` so enrichment rows are not capped out.

### Example Input: All Markets

```json
{
    "searchTerms": ["chanel classic flap", "gucci jackie bag"],
    "countries": ["ALL"],
    "maxListings": 100,
    "maxDatasetRecords": 250,
    "maxPagesPerCountry": 2,
    "includeDetails": true,
    "includeSellerInfo": true,
    "includeDuplicateSignals": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "missingRunsThreshold": 2
}
````

### Example Input: Selected Markets And Seller Countries

```json
{
    "searchTerms": ["loewe puzzle bag"],
    "countries": ["FR", "US", "GB"],
    "sellerCountries": ["FR", "IT", "GB"],
    "itemConditions": ["3", "4"],
    "maxListings": 50,
    "maxDatasetRecords": 75,
    "maxPagesPerCountry": 1,
    "includeDetails": false,
    "includeSellerInfo": true
}
```

### Example Input: French Seller Deal Search

```json
{
    "searchTerms": ["chanel classic flap"],
    "countries": ["ALL"],
    "sellerCountries": ["FR"],
    "itemConditions": ["3", "4"],
    "requiredKeywords": ["classic flap"],
    "maxListings": 20,
    "maxDatasetRecords": 40,
    "maxPagesPerCountry": 2,
    "includeDetails": false,
    "includeSellerInfo": false,
    "includeDuplicateSignals": false,
    "includeSoldItems": false
}
```

This searches all Vestiaire markets but only keeps listings whose seller/item country is France. If the market returns the same listing several times, only one listing row is pushed.

### Example Input: Sold Items Page

```json
{
    "startUrls": [
        {
            "url": "https://us.vestiairecollective.com/c/vip-sold-items-12125/"
        }
    ],
    "countries": ["US"],
    "maxListings": 25,
    "maxDatasetRecords": 25,
    "includeSoldItems": true,
    "includeDetails": false
}
```

With search terms, `includeSoldItems` also queries Vestiaire's public sold-search filter. With start URLs, it only parses URLs whose path is a sold-items page. Normal category, search, and product URLs are never forced into sold records.

### Output Examples

Listing:

```json
{
    "recordType": "listing",
    "sourceMode": "SEARCH_API",
    "country": "FR",
    "query": "chanel classic flap",
    "listingId": "101",
    "title": "Chanel classic flap bag",
    "brand": "Chanel",
    "condition": "Très bon état",
    "conditionSource": "vestiaire_field",
    "price": 4200,
    "currency": "EUR",
    "status": "available",
    "displayStatus": "Available",
    "url": "https://fr.vestiairecollective.com/women-bags/handbags/chanel/classic-flap-101.shtml",
    "sellerUsername": "pariscloset",
    "sellerCountry": "FR"
}
```

Sold item:

```json
{
    "recordType": "sold_item",
    "sourceMode": "SOLD_SEARCH_API",
    "country": "US",
    "listingId": "303",
    "title": "Saffiano leather tote",
    "brand": "Prada",
    "price": 650,
    "currency": "USD",
    "status": "sold",
    "isSold": true,
    "soldDisplayedPrice": 650,
    "lastPublicPrice": 650,
    "soldDetectedAt": "2026-06-06T12:01:00.000Z",
    "soldSource": "api-search",
    "soldConfidence": "api_sold_filter_verified"
}
```

Price history:

```json
{
    "recordType": "listing",
    "sourceMode": "TRACKING",
    "listingId": "101",
    "status": "likely_sold",
    "sellerUsername": "pariscloset",
    "sellerCountry": "FR",
    "lastPublicPrice": 3900,
    "currency": "EUR",
    "likelySoldDetectedAt": "2026-06-06T12:01:00.000Z",
    "priceHistory": [
        { "price": 4200, "currency": "EUR", "observedAt": "2026-06-01T12:00:00.000Z" },
        { "price": 3900, "currency": "EUR", "observedAt": "2026-06-04T12:00:00.000Z" }
    ]
}
```

Seller summary:

```json
{
    "recordType": "seller_summary",
    "sellerId": "seller-1",
    "sellerUsername": "pariscloset",
    "sellerCountry": "FR",
    "activeListingCountObserved": 12,
    "soldListingCountObserved": 4,
    "avgActivePrice": 1820,
    "avgSoldPriceObserved": 1540,
    "activeToSoldRatioObserved": 0.25
}
```

Duplicate risk signal:

```json
{
    "recordType": "risk_signal",
    "duplicateClusterId": "cluster-4c8f8e90a1c4f0b0d3c01f23",
    "duplicateSignalScore": 0.95,
    "riskSignalLevel": "medium",
    "duplicateReasons": ["same_title_brand_category", "same_image_url", "similar_price_band"],
    "similarListingIds": ["101", "102"],
    "sellerUsername": "pariscloset"
}
```

Run diagnostic:

```json
{
    "recordType": "run_diagnostic",
    "diagnosticType": "public_request_error",
    "ok": false,
    "message": "Public Vestiaire request failed before any dataset records could be collected.",
    "publicRequestErrors": [
        {
            "url": "https://fr.vestiairecollective.com/search/?q=chanel&page=1",
            "statusCode": 403,
            "message": "Vestiaire public request failed with HTTP 403"
        }
    ]
}
```

### Output Views

- `listings`: live listing and tracking records.
- `sold_items`: public sold item records.
- `product_details`: detail enrichment columns for product descriptions, material, authentication, shipping, and breadcrumbs. Use rows with `recordType === "detail"`.
- `price_history`: tracking states and public price observations.
- `seller_summary`: observed seller-level aggregates.
- `risk_signals`: conservative duplicate signals from public-record similarity.
- `diagnostics`: non-charged run diagnostics when public requests fail before records are collected.

### Tracking Behavior

The Actor stores durable state in the named key-value store set by `trackingStoreName`, defaulting to `vestiaire-smart-tracker`.

- First observation records the listing as active unless the page explicitly marks it sold.
- Repeated observations append public price changes.
- A disappeared listing becomes `missing` first.
- It becomes `likely_sold` only after `missingRunsThreshold` consecutive missing runs.
- An explicit sold page state remains `sold` in later runs.
- Seller fields are stored in tracking state when Vestiaire returns them, so later `TRACKING` records can preserve `sellerId`, `sellerUsername`, `sellerCountry`, and `sellerUrl`.
- Seller-country filters also apply to `TRACKING` rows. Old tracking states without seller country are skipped when a restrictive `sellerCountries` filter is active.
- The same listing can be seen through several market countries, but pushed listing/tracking rows are deduplicated by `listingId`.
- Failed public requests and `maxListings` or `maxDatasetRecords` interruptions do not mark previous listings as missing.

### Billing And Limits

This Actor uses Pay Per Event billing. It charges successfully processed search/start pages and charges before pushing each valuable dataset record. If a user charge limit is reached, it stops processing paid work and writes the run summary to `OUTPUT`.

Live Pay Per Event setup:

| Event name | Trigger | FREE | BRONZE | SILVER | GOLD+ |
| --- | --- | ---: | ---: | ---: | ---: |
| `search-page` | One successfully fetched and parsed search, sold-search, or start URL page | `$0.0020` | `$0.0018` | `$0.0015` | `$0.0012` |
| `listing-result` | One active listing or tracking result pushed to the dataset | `$0.025` | `$0.020` | `$0.018` | `$0.016` |
| `sold-item` | One public sold item result pushed to the dataset | `$0.030` | `$0.025` | `$0.022` | `$0.020` |
| `detail-enrichment` | One product detail enrichment row pushed to the dataset | `$0.007` | `$0.006` | `$0.005` | `$0.004` |
| `seller-profile` | One seller summary row pushed to the dataset | `$0.006` | `$0.004` | `$0.003` | `$0.002` |
| `duplicate-cluster` | One duplicate/risk signal row pushed to the dataset | `$0.006` | `$0.004` | `$0.003` | `$0.002` |

Billing notes:

- `listing-result` is the primary buyer-facing event.
- At BRONZE tier, listing-only runs are about `$20.08 / 1,000` results assuming roughly 24 results per search page; listing + details is about `$26.08 / 1,000`. At GOLD+ tier, listing + details is about `$20.05 / 1,000`.
- Keep the synthetic `apify-actor-start` event enabled at its default price.
- Disable `apify-default-dataset-item` or set it to `0` because this Actor already charges explicit dataset-record events.
- `OUTPUT.searchPagesProcessed` and `OUTPUT.searchPagesCharged` help verify page-level billing in smoke runs.
- Memory is capped at `512-1024 MB` in `actor.json` to avoid paying 4 GB run costs for lightweight HTTP scraping.

Limits:

- Works with public pages only.
- No login, cookies, private account data, or hidden seller data.
- Sold prices are public displayed prices, not private settlement amounts.
- Duplicate/risk signals are heuristics from public-record similarity, not authenticity or trust decisions.
- Live page structure can change; use small smoke runs before scaling.
- The Actor is not affiliated with Vestiaire Collective.

### Proxy Behavior

Apify Proxy is enabled by default through `proxyConfiguration: { "useApifyProxy": true }`. If you override `proxyConfiguration`, the Actor uses your provided Apify-compatible proxy settings. Local runs without Apify proxy credentials fall back to direct public requests and may return public request errors.

### Local Development

```bash
npm install
npm test
npm run build
apify validate-schema
apify run --purge --input-file test/smoke/inputs/search-small.json
```

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords or product names to search, for example `chanel classic flap`, `dior saddle`, or `hermes kelly 28`.

## `startUrls` (type: `array`):

Optional public Vestiaire Collective URLs, including category, search, product, or sold-items pages.

## `includeSoldItems` (type: `boolean`):

Adds sold\_item records from Vestiaire's public sold search filter. Useful for demand validation, market reports, and sold-price tracking.

## `countries` (type: `array`):

Choose Vestiaire country codes. Keep only `ALL` to search all 70 supported countries; do not combine `ALL` with specific countries.

## `sellerCountries` (type: `array`):

Optional seller country filter. This is different from Country selection: countries controls the Vestiaire market searched, sellerCountries controls where the seller/item is located.

## `itemConditions` (type: `array`):

Choose one or more Vestiaire item conditions. Leave empty to include every condition.

## `requiredKeywords` (type: `array`):

Optional precision filter. Every word or phrase entered here must appear in the item title or model, for example `classic flap` to avoid Trendy CC Flap results.

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

Maximum active, sold, or tracking listing records to collect before stopping search. Filters and deduplication can make the final result smaller.

## `maxDatasetRecords` (type: `integer`):

Maximum rows to push to the dataset, including listings, product details, sold items, seller summaries, risk signals, tracking rows, and diagnostics.

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

Backwards-compatible alias for Max Dataset records. If both fields are set, maxDatasetRecords wins.

## `maxPagesPerCountry` (type: `integer`):

Maximum search pages to fetch per selected country and search term.

## `maxRuntimeMinutes` (type: `integer`):

Stops starting new public requests after this many minutes. Already collected records can still be written to the dataset.

## `includeDetails` (type: `boolean`):

Fetch product pages and emit detail records with richer descriptions and product metadata.

## `includeSellerInfo` (type: `boolean`):

Emit seller\_summary records from observed listings and sold items.

## `includeDuplicateSignals` (type: `boolean`):

Emit conservative risk\_signal records for duplicate-looking listings and repeated seller patterns.

## `trackingStoreName` (type: `string`):

Named key-value store used for durable price history and active-to-likely-sold tracking state.

## `missingRunsThreshold` (type: `integer`):

Number of consecutive missing runs before an active listing is emitted as likely\_sold.

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

Optional Apify Proxy configuration. Keep the default unless you need a specific proxy setup.

## Actor input object example

```json
{
  "searchTerms": [
    "chanel classic flap"
  ],
  "startUrls": [
    {
      "url": "https://us.vestiairecollective.com/c/vip-sold-items-12125/"
    }
  ],
  "includeSoldItems": false,
  "countries": [
    "ALL"
  ],
  "sellerCountries": [
    "ALL"
  ],
  "itemConditions": [],
  "requiredKeywords": [],
  "maxListings": 100,
  "maxDatasetRecords": 100,
  "maxItems": 100,
  "maxPagesPerCountry": 10,
  "maxRuntimeMinutes": 20,
  "includeDetails": false,
  "includeSellerInfo": false,
  "includeDuplicateSignals": false,
  "trackingStoreName": "vestiaire-smart-tracker",
  "missingRunsThreshold": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "searchTerms": [
        "chanel classic flap"
    ],
    "startUrls": [
        {
            "url": "https://us.vestiairecollective.com/c/vip-sold-items-12125/"
        }
    ],
    "countries": [
        "ALL"
    ],
    "sellerCountries": [
        "ALL"
    ],
    "itemConditions": [],
    "requiredKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kazkn/vestiaire-collective-smart-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 = {
    "searchTerms": ["chanel classic flap"],
    "startUrls": [{ "url": "https://us.vestiairecollective.com/c/vip-sold-items-12125/" }],
    "countries": ["ALL"],
    "sellerCountries": ["ALL"],
    "itemConditions": [],
    "requiredKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kazkn/vestiaire-collective-smart-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 '{
  "searchTerms": [
    "chanel classic flap"
  ],
  "startUrls": [
    {
      "url": "https://us.vestiairecollective.com/c/vip-sold-items-12125/"
    }
  ],
  "countries": [
    "ALL"
  ],
  "sellerCountries": [
    "ALL"
  ],
  "itemConditions": [],
  "requiredKeywords": []
}' |
apify call kazkn/vestiaire-collective-smart-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vestiaire Collective Scraper: Sold Items & Seller Intelligence",
        "description": "Scrape public Vestiaire Collective live and sold listings across 70 markets. Extract prices, seller countries, conditions, product details, price history, and duplicate/suspicious seller signals.",
        "version": "0.1",
        "x-build-id": "qWPrIJ4axxWVV5etw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kazkn~vestiaire-collective-smart-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kazkn-vestiaire-collective-smart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kazkn~vestiaire-collective-smart-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kazkn-vestiaire-collective-smart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kazkn~vestiaire-collective-smart-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kazkn-vestiaire-collective-smart-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTerms": {
                        "title": "🔎 Search terms",
                        "type": "array",
                        "description": "Keywords or product names to search, for example `chanel classic flap`, `dior saddle`, or `hermes kelly 28`.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "startUrls": {
                        "title": "🔗 Direct Vestiaire URLs",
                        "type": "array",
                        "description": "Optional public Vestiaire Collective URLs, including category, search, product, or sold-items pages.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "includeSoldItems": {
                        "title": "✅ Include sold items",
                        "type": "boolean",
                        "description": "Adds sold_item records from Vestiaire's public sold search filter. Useful for demand validation, market reports, and sold-price tracking.",
                        "default": false
                    },
                    "countries": {
                        "title": "🌐 Country selection",
                        "type": "array",
                        "description": "Choose Vestiaire country codes. Keep only `ALL` to search all 70 supported countries; do not combine `ALL` with specific countries.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ALL",
                                "AD",
                                "AU",
                                "AT",
                                "BH",
                                "BE",
                                "BR",
                                "BG",
                                "CA",
                                "IC",
                                "CN",
                                "HR",
                                "CY",
                                "CZ",
                                "DK",
                                "EE",
                                "FI",
                                "FR",
                                "GF",
                                "PF",
                                "DE",
                                "GI",
                                "GR",
                                "GP",
                                "GG",
                                "HK",
                                "HU",
                                "ID",
                                "IE",
                                "IM",
                                "IL",
                                "IT",
                                "JP",
                                "JE",
                                "KW",
                                "LV",
                                "LB",
                                "LI",
                                "LT",
                                "LU",
                                "MY",
                                "MT",
                                "MQ",
                                "YT",
                                "MC",
                                "NL",
                                "NC",
                                "NZ",
                                "NO",
                                "PH",
                                "PL",
                                "PT",
                                "QA",
                                "RE",
                                "RO",
                                "SA",
                                "SG",
                                "SK",
                                "SI",
                                "ZA",
                                "KR",
                                "ES",
                                "BL",
                                "MF",
                                "SE",
                                "CH",
                                "TW",
                                "TH",
                                "AE",
                                "GB",
                                "US"
                            ],
                            "enumTitles": [
                                "🌐 ALL - All 70 supported Vestiaire countries",
                                "🇦🇩 AD - Andorra",
                                "🇦🇺 AU - Australia",
                                "🇦🇹 AT - Austria",
                                "🇧🇭 BH - Bahrain",
                                "🇧🇪 BE - Belgium",
                                "🇧🇷 BR - Brazil",
                                "🇧🇬 BG - Bulgaria",
                                "🇨🇦 CA - Canada",
                                "🏝️ IC - Canary Islands",
                                "🇨🇳 CN - China",
                                "🇭🇷 HR - Croatia",
                                "🇨🇾 CY - Cyprus",
                                "🇨🇿 CZ - Czech Republic",
                                "🇩🇰 DK - Denmark",
                                "🇪🇪 EE - Estonia",
                                "🇫🇮 FI - Finland",
                                "🇫🇷 FR - France",
                                "🇬🇫 GF - French Guiana",
                                "🇵🇫 PF - French Polynesia",
                                "🇩🇪 DE - Germany",
                                "🇬🇮 GI - Gibraltar",
                                "🇬🇷 GR - Greece",
                                "🇬🇵 GP - Guadeloupe",
                                "🇬🇬 GG - Guernsey",
                                "🇭🇰 HK - Hong Kong",
                                "🇭🇺 HU - Hungary",
                                "🇮🇩 ID - Indonesia",
                                "🇮🇪 IE - Ireland",
                                "🇮🇲 IM - Isle of Man",
                                "🇮🇱 IL - Israel",
                                "🇮🇹 IT - Italy",
                                "🇯🇵 JP - Japan",
                                "🇯🇪 JE - Jersey",
                                "🇰🇼 KW - Kuwait",
                                "🇱🇻 LV - Latvia",
                                "🇱🇧 LB - Lebanon",
                                "🇱🇮 LI - Liechtenstein",
                                "🇱🇹 LT - Lithuania",
                                "🇱🇺 LU - Luxembourg",
                                "🇲🇾 MY - Malaysia",
                                "🇲🇹 MT - Malta",
                                "🇲🇶 MQ - Martinique",
                                "🇾🇹 YT - Mayotte",
                                "🇲🇨 MC - Monaco",
                                "🇳🇱 NL - Netherlands",
                                "🇳🇨 NC - New Caledonia",
                                "🇳🇿 NZ - New Zealand",
                                "🇳🇴 NO - Norway",
                                "🇵🇭 PH - Philippines",
                                "🇵🇱 PL - Poland",
                                "🇵🇹 PT - Portugal",
                                "🇶🇦 QA - Qatar",
                                "🇷🇪 RE - Réunion",
                                "🇷🇴 RO - Romania",
                                "🇸🇦 SA - Saudi Arabia",
                                "🇸🇬 SG - Singapore",
                                "🇸🇰 SK - Slovakia",
                                "🇸🇮 SI - Slovenia",
                                "🇿🇦 ZA - South Africa",
                                "🇰🇷 KR - South Korea",
                                "🇪🇸 ES - Spain",
                                "🇧🇱 BL - St Barthélemy",
                                "🇲🇫 MF - St Martin",
                                "🇸🇪 SE - Sweden",
                                "🇨🇭 CH - Switzerland",
                                "🇹🇼 TW - Taiwan",
                                "🇹🇭 TH - Thailand",
                                "🇦🇪 AE - United Arab Emirates",
                                "🇬🇧 GB - United Kingdom",
                                "🇺🇸 US - United States"
                            ]
                        },
                        "default": [
                            "ALL"
                        ]
                    },
                    "sellerCountries": {
                        "title": "👤 Seller countries",
                        "type": "array",
                        "description": "Optional seller country filter. This is different from Country selection: countries controls the Vestiaire market searched, sellerCountries controls where the seller/item is located.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ALL",
                                "AD",
                                "AU",
                                "AT",
                                "BH",
                                "BE",
                                "BR",
                                "BG",
                                "CA",
                                "IC",
                                "CN",
                                "HR",
                                "CY",
                                "CZ",
                                "DK",
                                "EE",
                                "FI",
                                "FR",
                                "GF",
                                "PF",
                                "DE",
                                "GI",
                                "GR",
                                "GP",
                                "GG",
                                "HK",
                                "HU",
                                "ID",
                                "IE",
                                "IM",
                                "IL",
                                "IT",
                                "JP",
                                "JE",
                                "KW",
                                "LV",
                                "LB",
                                "LI",
                                "LT",
                                "LU",
                                "MY",
                                "MT",
                                "MQ",
                                "YT",
                                "MC",
                                "NL",
                                "NC",
                                "NZ",
                                "NO",
                                "PH",
                                "PL",
                                "PT",
                                "QA",
                                "RE",
                                "RO",
                                "SA",
                                "SG",
                                "SK",
                                "SI",
                                "ZA",
                                "KR",
                                "ES",
                                "BL",
                                "MF",
                                "SE",
                                "CH",
                                "TW",
                                "TH",
                                "AE",
                                "GB",
                                "US"
                            ],
                            "enumTitles": [
                                "🌐 ALL - All 70 supported Vestiaire countries",
                                "🇦🇩 AD - Andorra",
                                "🇦🇺 AU - Australia",
                                "🇦🇹 AT - Austria",
                                "🇧🇭 BH - Bahrain",
                                "🇧🇪 BE - Belgium",
                                "🇧🇷 BR - Brazil",
                                "🇧🇬 BG - Bulgaria",
                                "🇨🇦 CA - Canada",
                                "🏝️ IC - Canary Islands",
                                "🇨🇳 CN - China",
                                "🇭🇷 HR - Croatia",
                                "🇨🇾 CY - Cyprus",
                                "🇨🇿 CZ - Czech Republic",
                                "🇩🇰 DK - Denmark",
                                "🇪🇪 EE - Estonia",
                                "🇫🇮 FI - Finland",
                                "🇫🇷 FR - France",
                                "🇬🇫 GF - French Guiana",
                                "🇵🇫 PF - French Polynesia",
                                "🇩🇪 DE - Germany",
                                "🇬🇮 GI - Gibraltar",
                                "🇬🇷 GR - Greece",
                                "🇬🇵 GP - Guadeloupe",
                                "🇬🇬 GG - Guernsey",
                                "🇭🇰 HK - Hong Kong",
                                "🇭🇺 HU - Hungary",
                                "🇮🇩 ID - Indonesia",
                                "🇮🇪 IE - Ireland",
                                "🇮🇲 IM - Isle of Man",
                                "🇮🇱 IL - Israel",
                                "🇮🇹 IT - Italy",
                                "🇯🇵 JP - Japan",
                                "🇯🇪 JE - Jersey",
                                "🇰🇼 KW - Kuwait",
                                "🇱🇻 LV - Latvia",
                                "🇱🇧 LB - Lebanon",
                                "🇱🇮 LI - Liechtenstein",
                                "🇱🇹 LT - Lithuania",
                                "🇱🇺 LU - Luxembourg",
                                "🇲🇾 MY - Malaysia",
                                "🇲🇹 MT - Malta",
                                "🇲🇶 MQ - Martinique",
                                "🇾🇹 YT - Mayotte",
                                "🇲🇨 MC - Monaco",
                                "🇳🇱 NL - Netherlands",
                                "🇳🇨 NC - New Caledonia",
                                "🇳🇿 NZ - New Zealand",
                                "🇳🇴 NO - Norway",
                                "🇵🇭 PH - Philippines",
                                "🇵🇱 PL - Poland",
                                "🇵🇹 PT - Portugal",
                                "🇶🇦 QA - Qatar",
                                "🇷🇪 RE - Réunion",
                                "🇷🇴 RO - Romania",
                                "🇸🇦 SA - Saudi Arabia",
                                "🇸🇬 SG - Singapore",
                                "🇸🇰 SK - Slovakia",
                                "🇸🇮 SI - Slovenia",
                                "🇿🇦 ZA - South Africa",
                                "🇰🇷 KR - South Korea",
                                "🇪🇸 ES - Spain",
                                "🇧🇱 BL - St Barthélemy",
                                "🇲🇫 MF - St Martin",
                                "🇸🇪 SE - Sweden",
                                "🇨🇭 CH - Switzerland",
                                "🇹🇼 TW - Taiwan",
                                "🇹🇭 TH - Thailand",
                                "🇦🇪 AE - United Arab Emirates",
                                "🇬🇧 GB - United Kingdom",
                                "🇺🇸 US - United States"
                            ]
                        },
                        "default": [
                            "ALL"
                        ]
                    },
                    "itemConditions": {
                        "title": "🧥 Item condition",
                        "type": "array",
                        "description": "Choose one or more Vestiaire item conditions. Leave empty to include every condition.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "🏷️ Jamais porté avec étiquette",
                                "✨ Jamais porté",
                                "✅ Très bon état",
                                "👍 Bon état",
                                "🛠️ Correct"
                            ]
                        },
                        "default": []
                    },
                    "requiredKeywords": {
                        "title": "🎯 Required title/model keywords",
                        "type": "array",
                        "description": "Optional precision filter. Every word or phrase entered here must appear in the item title or model, for example `classic flap` to avoid Trendy CC Flap results.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        },
                        "default": []
                    },
                    "maxListings": {
                        "title": "👜 Max Listings",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum active, sold, or tracking listing records to collect before stopping search. Filters and deduplication can make the final result smaller.",
                        "default": 100
                    },
                    "maxDatasetRecords": {
                        "title": "📊 Max Dataset records",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum rows to push to the dataset, including listings, product details, sold items, seller summaries, risk signals, tracking rows, and diagnostics.",
                        "default": 100
                    },
                    "maxItems": {
                        "title": "🔁 Legacy max records alias",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Backwards-compatible alias for Max Dataset records. If both fields are set, maxDatasetRecords wins.",
                        "default": 100
                    },
                    "maxPagesPerCountry": {
                        "title": "📄 Max pages per country",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum search pages to fetch per selected country and search term.",
                        "default": 10
                    },
                    "maxRuntimeMinutes": {
                        "title": "⏱️ Max runtime",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stops starting new public requests after this many minutes. Already collected records can still be written to the dataset.",
                        "default": 20
                    },
                    "includeDetails": {
                        "title": "🧾 Product details",
                        "type": "boolean",
                        "description": "Fetch product pages and emit detail records with richer descriptions and product metadata.",
                        "default": false
                    },
                    "includeSellerInfo": {
                        "title": "👤 Seller intelligence",
                        "type": "boolean",
                        "description": "Emit seller_summary records from observed listings and sold items.",
                        "default": false
                    },
                    "includeDuplicateSignals": {
                        "title": "🚩 Duplicate / suspicious signals",
                        "type": "boolean",
                        "description": "Emit conservative risk_signal records for duplicate-looking listings and repeated seller patterns.",
                        "default": false
                    },
                    "trackingStoreName": {
                        "title": "🗄️ Tracking storage name",
                        "type": "string",
                        "description": "Named key-value store used for durable price history and active-to-likely-sold tracking state.",
                        "default": "vestiaire-smart-tracker"
                    },
                    "missingRunsThreshold": {
                        "title": "📉 Missing runs before likely sold",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of consecutive missing runs before an active listing is emitted as likely_sold.",
                        "default": 2
                    },
                    "proxyConfiguration": {
                        "title": "🛡️ Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy configuration. Keep the default unless you need a specific proxy setup.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
