# Vestiaire Collective Scraper - Products, Prices & Sellers (`abotapi/vestiaire-collective-scraper`) Actor

Scrape Vestiaire Collective, the luxury resale marketplace: listings with prices in 7 markets, full product details with seller statistics, sold-item comparables, sale campaigns and the journal news feed. Search, URL and journal modes with sorting, filters and scheduled change tracking.

- **URL**: https://apify.com/abotapi/vestiaire-collective-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 listing or journal records

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/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 Scraper: Products, Prices & Sellers

Vestiaire Collective Scraper turns the world's leading luxury resale marketplace into a clean data API. Search keywords, walk any category, brand or sale campaign, follow a seller's closet, collect sold-item comparables, or track the journal news feed - and get structured rows with prices and original prices, condition reports, materials, measurements, buyer fees, seller statistics, full photo sets and market currencies across 7 storefronts - then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Seven markets, one actor.** Australia, United States, United Kingdom, France, Germany, Italy and Spain, each with its own currency and language; category links carry their own market automatically.
- **Three ways in.** Keyword search, pasted links of every shape the site emits (search, category, brand, model, sale campaign, new arrivals, seller profile, product page, journal), or the journal news mode.
- **Full price picture.** Current price, original price, discount percentage, buyer fee and the seller's own asking price on enriched rows - sold items included as resale comparables.
- **Real detail reads.** The condition report, material, measurements, negotiability, seller statistics (items sold, listings, pass rate, rating badge) and the complete photo gallery on each enriched row.
- **Journal included.** The marketplace's editorial news feed with titles, summaries, categories and dates - no other Vestiaire Collective scraper ships the news.
- **Built for schedules.** Incremental mode returns only new and changed records on recurring runs, and a refused run fails loudly instead of returning an empty dataset.

### Use Cases

- **Who:** luxury resellers and arbitrage hunters - track asking prices across markets, compare sold prices, and watch seller closets for fresh consignment.
- **Who:** market researchers - measure brand and category inventory, discount depth and condition mix on a schedule.
- **Who:** pricing analysts - build sold-item comparables with the Sold listings only toggle.

### Data You Get

> Sample shape: one row per product, from a live record.

| Field | Example |
|---|---|
| `title` | Grand shopping leather tote |
| `brand` | Chanel |
| `model` | Grand shopping |
| `price` | 2100.0 |
| `wasPrice` | 2415.0 |
| `discountPercent` | 13 |
| `currency` | AUD |
| `conditionDescription` | Very good condition |
| `material` | Leather |
| `measurements` | \[{"name": "Width", "value": "33"}, {"name": "Height", "value": "25"}] |
| `buyerFee` | 28.0 |
| `sellerName` | Mina |
| `sellerRatingBadge` | Common |
| `sold` | false |
| `url` | (the listing page on Vestiaire Collective) |
| `changeType` | NEW |

### How to Use

1. Pick a mode: **keyword search** (default), **paste links**, or **journal** for the news feed.
2. In URL mode, paste any mix of search, category, brand, model, sale, new arrivals, seller, product and journal links (search links honour `?page=` and `?sortBy=`). Leave the field untouched and the run walks one example link of each shape, sharing Max items evenly between them. In search mode, add keywords and narrow with condition, department, price range or curator picks.
3. Set **Max items** for the run cap (20 by default) and keep **Fetch product details** on for the condition report, seller statistics and galleries.
4. Run the actor and export the dataset, or select an MCP connector to send records into your apps.

**Search keywords:**

```json
{"mode": "search", "searchTerms": ["chanel bag"], "market": "AU", "maxItems": 20}
```

**Sold-item comparables:**

```json
{"mode": "search", "searchTerms": ["hermes birkin"], "soldOnly": true, "sort": "price-desc", "maxItems": 50}
```

**Walk a category and the sale campaign:**

```json
{"mode": "urls", "urls": ["https://www.vestiairecollective.com/women-bags/handbags/chanel/", "https://www.vestiairecollective.com/c/flash-price-drops-10474/"], "maxItems": 40}
```

**Collect the journal news feed:**

```json
{"mode": "journal", "journalCategories": ["fashion-stories"], "maxItems": 20}
```

#### Run it from your code

**Run it from Python:**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/vestiaire-collective-scraper").call(run_input={
 "mode": "search",
 "searchTerms": ["chanel bag"],
 "maxItems": 20,
 "fetchDetails": True,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**Run it from JavaScript:**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/vestiaire-collective-scraper').call({
 mode: 'search',
 searchTerms: ['chanel bag'],
 maxItems: 20,
 fetchDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Supported link shapes

| Shape | Example path |
|---|---|
| Search | `/search/?q=chanel%20bag` (`&page=2`, `&sortBy=price-asc` honoured; sort values: relevance, price-asc, price-desc, recency) |
| Category | `/women-bags/handbags/` |
| Brand and category | `/women-bags/handbags/chanel/` |
| Brand | `/chanel/` |
| Model | `/women-bags/handbags/chanel/grand-shopping/` |
| Sale campaign | `/c/flash-price-drops-10474/` |
| New arrivals | `/new-items/` |
| Seller profile | `/profile/32743220` |
| Product | `/women-bags/handbags/chanel/<slug>-72479772.shtml` |
| Journal index, category or article | `/journal/` |

URL mode with the field untouched walks the example links above in turn and shares Max items evenly between them, so every shape returns rows once Max items is at least the number of links.

#### Tips

- A product link always reads its product record: the read is that record's only data source, so the detail fee applies even with the listing-row toggle off.
- The catalog serves the first ~1,020 listings per scope (the feed's own depth limit); sort by price to reach deeper slices of an expensive category.
- Price ranges and price sort follow the selected market's currency; category and brand links keep their own market and currency.
- Journal records include full article text (`content`), HTML (`contentHtml`), ordered content blocks, images and article links. Narrow the feed with **Journal categories** (for example fashion-stories, promotions, sustainability), or paste a specific article URL. `contentStatus` reports `complete` or `unavailable` when only the summary could be read.
- Keep **Fetch details** enabled for the full product gallery (`pictureUrls` and `imageCount`), sizes and seller attributes. Turning it off returns listing cards, usually with one preview photo; `detailStatus` makes this explicit. `productDetails` preserves category-specific source attributes. Null sizes on bags or absent original prices are source omissions, not invented values.

### Send results into your apps (MCP connectors)

Optionally send records into the apps you already use through MCP connectors: set **MCP connectors** (for example a Notion database) and cap the export with **Max items to export per connector**. The export is a gated side channel: it never changes the dataset.

| Field | What it does |
|---|---|
| `mcpConnectors` | Connector ids to export to (empty = no export). |
| `notionParentPageUrl` | URL or id of the Notion parent page (required for the Notion connector). |
| `maxNotifyListings` | Cap on records written to each connector per run. |

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | How to start the scrape: keyword search, pasted links, or the journal feed. |
| `searchTerms` | array | - | Keywords for search mode, for example 'chanel bag', 'hermes birkin'. |
| `urls` | array | eleven example links | One example of each link shape (table above). Search, category, brand, model, sale, new arrivals, seller, product or journal links, any mix. |
| `journalCategories` | array | - | Narrow the journal feed to categories like fashion-stories or promotions. |
| `market` | string | `AU` | Storefront: AU, US, GB, FR, DE, IT or ES. Prices follow the market's currency. |
| `sort` | string | `relevance` | Listing order: relevance, price low to high, price high to low, or most recent. |
| `soldOnly` | boolean | `false` | Walk only sold listings (resale comparables). |
| `conditions` | array | - | Condition filter: never worn (with or without tag), very good, good or fair. |
| `universes` | array | - | Department filter: women, men or kids. |
| `priceRanges` | array | - | Price buckets in the market's currency: 0-100, 100-500, 500+. |
| `editorPicks` | array | - | Curator labels: We love, Vintage, Exceptional Pieces. |
| `fetchDetails` | boolean | `true` | Read each product's full record: condition, material, measurements, fees, seller statistics, gallery. |
| `maxItems` | integer | `20` | The single cap on the run: stop after this many records. |
| `proxy` | object | shared datacenter | Leave the default for the cheapest run. Residential access is used automatically as a backup when your plan includes it; you can also pick it here or supply your own proxy URLs. |
| `resumeFromRunId` | string | - | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. |
| `incrementalMode` | boolean | `false` | Track changes across scheduled runs; suppress and never bill unchanged records. |
| `stateKey` | string | - | Optional name for the incremental baseline. |
| `emitUnchanged` | boolean | `false` | Also return unchanged records, marked and billed. |
| `emitExpired` | boolean | `false` | Also return disappeared records, marked and billed. |
| `ignoreFieldsForChanges` | array | - | Extra top-level fields excluded from change detection (the likes counter is always ignored). |
| `mcpConnectors` | array | - | Connector ids to export to (empty = no export). |
| `notionParentPageUrl` | string | - | URL or id of the Notion parent page (required for the Notion connector). |
| `maxNotifyListings` | integer | `50` | Cap on records written to each connector per run. |

### Output Example

> Sample shape: one row per product, from a live record.

**Live record: Grand shopping leather tote**

```json
{
 "productId": "72479772",
 "title": "Grand shopping leather tote",
 "brand": "Chanel",
 "model": "Grand shopping",
 "price": 2100.0,
 "wasPrice": 2415.0,
 "discountPercent": 13,
 "currency": "AUD",
 "conditionDescription": "Very good condition",
 "material": "Leather",
 "measurementFormatted": "Width 33 cm, Height 25 cm, Depth 13 cm",
 "buyerFee": 28.0,
 "sellerName": "Mina",
 "sellerRatingBadge": "Common",
 "sold": false,
 "imageCount": 15
}
```

### Plan Requirement

The catalog and product data load through the default shared connection, which keeps costs low. The site's own pages sit behind a challenge that datacenter and residential connections alike cannot pass, so the actor reads the marketplace's data feeds instead. If the selected connection is refused, the actor continues on a backup connection and logs: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies." Some pages may then stay unavailable. If no page can be read at all, the run fails with a clear message ("Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search.") instead of returning an empty dataset. A paid Apify plan, or your own proxy URLs, gives the most reliable access.

### FAQ

#### How much does it cost?

The actor is pay per event: a start fee per run, a per-record fee for every record returned, and a detail surcharge when a product's full record is read (on by default). Exact prices are on the actor's Pricing tab. `Max items` is the cost lever: a run's record count is bounded by it.

#### Is it legal to scrape Vestiaire Collective?

The actor reads the public marketplace surfaces: search, category, product and journal data. It does not access accounts, wishlists or checkout. You are responsible for using the data in line with the site's terms of use, privacy law such as GDPR or CCPA, and applicable regulations; personal data of identifiable individuals requires a lawful basis.

#### Does it include product reviews?

Vestiaire Collective does not publish buyer reviews or star ratings on listings. What the marketplace does publish is the seller's track record - items sold, listings, pass rate and a rating badge - and every enriched row carries it.

#### Can I get only new or changed items on a schedule?

Yes. Turn on **Incremental mode** and schedule the actor. The first run returns everything matching as NEW; later runs return only NEW and UPDATED records. Price moves, sell-outs and restocks all count as changes; the likes counter does not. Use **State key** to keep a monitoring campaign stable, and **Emit unchanged** or **Emit expired** only if you also want those rows (they return and bill extra rows).

#### Why did a run return fewer results than the site shows?

The feed serves the first ~1,020 listings per scope, and the run stops at **Max items** (20 by default). Raise the cap, sort by price to slice deeper, or narrow the scope.

#### Why did my run fail instead of returning an empty dataset?

A run that never got a single readable answer fails loudly with a connection message instead of reporting an empty catalog. On a scheduled incremental run with no changes, the run reports "Nothing changed since the last run" instead of an empty-catalog message. A run that reads some pages but is refused others still succeeds and names the refused count with a Partial results status.

#### What does the run summary contain?

Each run stores a summary under the key-value store key `OUTPUT`: records returned, records scanned, detail reads charged and failed, scopes and scopes with errors, pages served and refused, and flags for cap reached, cut by deadline, incremental mode and resumed run. Dataset rows follow a declared fields contract, so every row has the same typed columns; fields the source omits are null.

#### Can I use it with AI agents or MCP?

Yes. Every record is plain JSON over the dataset API, and the MCP connector export sends rows straight into tools like Notion. Point an agent at the dataset items endpoint with the input above.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏷️ <a href="https://apify.com/abotapi/poshmark-scraper"><b>Poshmark Scraper</b></a><br>Scrape Poshmark fashion-resale listings: keyword search, brand and category browse, sold...</td><td>🛒 <a href="https://apify.com/abotapi/muji-scraper"><b>MUJI Scraper</b></a><br>Scrape MUJI products from the United States, Canada and Australia storefronts. Search by...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/curtsy-app-scraper"><b>Curtsy Fashion Resale Scraper</b></a><br>Scrape Curtsy, the US secondhand fashion marketplace: listings with brand, size, list vs...</td><td>🛒 <a href="https://apify.com/abotapi/therealreal-scraper"><b>The RealReal Scraper</b></a><br>Scrape luxury consignment listings from therealreal.com. Browse by designer, category or...</td></tr>
<tr><td>📰 <a href="https://apify.com/abotapi/veepee-scraper"><b>Veepee Scraper</b></a><br>Scrape Veepee flash sales: live campaigns with brands, dates and discounts plus per-sale...</td><td>🧩 <a href="https://apify.com/abotapi/grailed-marketplace-scraper"><b>Grailed Scraper</b></a><br>Scrape Grailed by keyword, category, designer, condition, size or URL. Extract prices and...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/vestiaire-collective-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

How to discover what to scrape. Search reads keyword listings. Paste URLs walks any mix of category, brand, sale, new-arrival, seller and product links. Journal collects the editorial news feed.

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

Only used when Mode = Keyword search. One entry per keyword (for example chanel bag, hermes birkin). Each entry becomes its own listing walk in the selected market.

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

Only used when Mode = Paste URLs. Paste any mix of search links (/search/?q=term), category and brand pages (/women-bags/handbags/chanel/), brand pages (/chanel/), sale campaigns (/c/flash-price-drops-10474/), new arrivals (/new-items/), seller profiles (/profile/123), product pages (...-123456.shtml) and journal pages (/journal/...). The default walks one example of every shape.

## `journalCategories` (type: `array`):

Only used when Mode = Journal. Leave empty for the whole news feed, or narrow it to categories such as fashion-stories, inside-vestiaire, labels-we-love, sustainability, promotions, fashion-reports or authentication-101.

## `market` (type: `string`):

Which storefront to read: Australia (default), United States, United Kingdom, France, Germany, Italy or Spain. Links carry their own market; keywords and editorial reads use this selection. Prices follow the market's currency.

## `sort` (type: `string`):

Order of listings: the marketplace's own relevance order (default), price low to high, price high to low, or most recent first.

## `soldOnly` (type: `boolean`):

On = walk only sold listings (useful for resale price comparables). Off = the marketplace's default feed, which mixes available items with recently sold ones.

## `conditions` (type: `array`):

Only used for keyword, category and brand walks. Leave empty for every condition, or pick one or more.

## `universes` (type: `array`):

Only used for keyword, category and brand walks. Leave empty for every department, or pick one or more.

## `priceRanges` (type: `array`):

Only used for keyword, category and brand walks. Leave empty for every price, or pick one or more buckets in the market's currency.

## `editorPicks` (type: `array`):

Only used for keyword, category and brand walks. Leave empty for everything, or pick one or more of the marketplace's own edit labels.

## `fetchDetails` (type: `boolean`):

Read each product’s full record, including all photos, sizes, condition, material, measurements, fees and seller statistics. Enabled by default. Turn this off for listing cards only (usually one preview photo and no detail attributes). Pasted product pages always read details. Journal article bodies are always included when available.

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

The single cap on the run: stop after collecting this many records across all searches, links and journal pages. Set 0 for no cap.

## `proxy` (type: `object`):

Leave the default for the cheapest run: the feeds serve over the ordinary shared connection. If runs fail with connection errors, switch to residential.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue that interrupted run without returning or charging for records already collected there. For recurring monitoring of the same scope, use Recurring updates below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. Later runs return only NEW and UPDATED records.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its memory stable. Leave empty to key the memory on this run setup automatically.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns and bills extra rows you already have.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return records that were present before but are no longer found, marked EXPIRED. Only produced when a run covered its whole setup.

## `ignoreFieldsForChanges` (type: `array`):

Output field names that should NOT mark a record as UPDATED. The likes counter is always ignored because it ticks continuously, and scrapedAt is stamped fresh on every fetch.

## `mcpConnectors` (type: `array`):

Optionally send records into the apps you already use through MCP connectors. Empty means no export.

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which record pages are created. Required to enable the Notion connector.

## `maxNotifyListings` (type: `integer`):

Cap on records written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "chanel bag"
  ],
  "urls": [
    "https://www.vestiairecollective.com/search/?q=chanel%20bag",
    "https://www.vestiairecollective.com/women-bags/handbags/",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/",
    "https://www.vestiairecollective.com/chanel/",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/grand-shopping/",
    "https://www.vestiairecollective.com/c/flash-price-drops-10474/",
    "https://www.vestiairecollective.com/new-items/",
    "https://www.vestiairecollective.com/profile/32743220",
    "https://www.vestiairecollective.com/journal/",
    "https://www.vestiairecollective.com/search/?q=chanel%20bag&page=2&sortBy=price-asc",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/black-leather-grand-shopping-chanel-handbag-72479772.shtml"
  ],
  "market": "AU",
  "sort": "relevance",
  "soldOnly": false,
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `detail` (type: `string`):

No description

## `journal` (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 = {
    "mode": "search",
    "searchTerms": [
        "chanel bag"
    ],
    "urls": [
        "https://www.vestiairecollective.com/search/?q=chanel%20bag",
        "https://www.vestiairecollective.com/women-bags/handbags/",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/",
        "https://www.vestiairecollective.com/chanel/",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/grand-shopping/",
        "https://www.vestiairecollective.com/c/flash-price-drops-10474/",
        "https://www.vestiairecollective.com/new-items/",
        "https://www.vestiairecollective.com/profile/32743220",
        "https://www.vestiairecollective.com/journal/",
        "https://www.vestiairecollective.com/search/?q=chanel%20bag&page=2&sortBy=price-asc",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/black-leather-grand-shopping-chanel-handbag-72479772.shtml"
    ],
    "market": "AU",
    "sort": "relevance",
    "soldOnly": false,
    "fetchDetails": true,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "maxNotifyListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/vestiaire-collective-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 = {
    "mode": "search",
    "searchTerms": ["chanel bag"],
    "urls": [
        "https://www.vestiairecollective.com/search/?q=chanel%20bag",
        "https://www.vestiairecollective.com/women-bags/handbags/",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/",
        "https://www.vestiairecollective.com/chanel/",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/grand-shopping/",
        "https://www.vestiairecollective.com/c/flash-price-drops-10474/",
        "https://www.vestiairecollective.com/new-items/",
        "https://www.vestiairecollective.com/profile/32743220",
        "https://www.vestiairecollective.com/journal/",
        "https://www.vestiairecollective.com/search/?q=chanel%20bag&page=2&sortBy=price-asc",
        "https://www.vestiairecollective.com/women-bags/handbags/chanel/black-leather-grand-shopping-chanel-handbag-72479772.shtml",
    ],
    "market": "AU",
    "sort": "relevance",
    "soldOnly": False,
    "fetchDetails": True,
    "maxItems": 20,
    "proxy": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "maxNotifyListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/vestiaire-collective-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 '{
  "mode": "search",
  "searchTerms": [
    "chanel bag"
  ],
  "urls": [
    "https://www.vestiairecollective.com/search/?q=chanel%20bag",
    "https://www.vestiairecollective.com/women-bags/handbags/",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/",
    "https://www.vestiairecollective.com/chanel/",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/grand-shopping/",
    "https://www.vestiairecollective.com/c/flash-price-drops-10474/",
    "https://www.vestiairecollective.com/new-items/",
    "https://www.vestiairecollective.com/profile/32743220",
    "https://www.vestiairecollective.com/journal/",
    "https://www.vestiairecollective.com/search/?q=chanel%20bag&page=2&sortBy=price-asc",
    "https://www.vestiairecollective.com/women-bags/handbags/chanel/black-leather-grand-shopping-chanel-handbag-72479772.shtml"
  ],
  "market": "AU",
  "sort": "relevance",
  "soldOnly": false,
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}' |
apify call abotapi/vestiaire-collective-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/vestiaire-collective-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/W0JeoT1ts6NwfUlDJ/builds/RkryEyWffqMpXqTbv/openapi.json
