# Switch Scraper - Luxury Handbags, Jewelry & Rental Listings (`abotapi/joinswitch-rental-scraper`) Actor

Scrape Switch designer handbag and jewelry rental listings by keyword, filter or URL. Extract product names, brands, retail values, member purchase prices, Core or Select membership tiers, availability and product images.

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

## Pricing

from $1.60 / 1,000 rental piece 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

## Switch Rental Scraper: Luxury Jewelry & Handbag Rental Catalog

This actor returns the Switch luxury rental catalog as structured records: designer jewelry and handbags from Chanel, Hermes, Dior, Gucci, Cartier, Louis Vuitton and more, with retail value, member buy price, rental tier (Core or Select), availability, image gallery and the store's own category, collection and occasion tags. Search by keyword, walk the catalog with filters, or paste Switch URLs. Results arrive in the dataset as clean JSON, with CSV, Excel and API export built in.

### Why This Scraper?

- **Three ways in.** Keyword search across the catalog, filtered browse walks (brand, category, occasion, collection, tier, availability, sort), or pasted piece and catalog URLs.
- **Everything on the card.** Brand, category, collection, occasion, rental tier, retail value, member buy price, availability, favorite and restock-watch counts, description, condition and authenticity notes, and the lead image.
- **Full gallery on request.** With piece details on, every record also carries the complete image gallery from the piece's own page, plus fresh availability and prices.
- **Watch the catalog.** Incremental mode reports NEW, UPDATED and REAPPEARED pieces across scheduled runs, so a daily walk returns only what changed since last time.
- **Resume big walks.** An interrupted or capped crawl continues from where it stopped, without charging for pieces already collected.
- **Depth without caps that surprise.** Forward pagination walks the store's own pages to the natural end; the only binding cap is Max items.
- **Pipe it anywhere.** Records land in the dataset and, optionally, straight into Notion, Airtable, Linear or any MCP-connected app.

### Use Cases

- **Resale and pricing analysts:** track retail values and member buy prices across the designer rental market as a pricing signal.
- **Personal shoppers and stylists:** monitor availability of specific bags and jewelry pieces and get told when a piece is back on the shelf.
- **Market researchers:** quantify catalog composition by brand, category, collection and rental tier, and how it shifts month to month.
- **Deal and drop watchers:** schedule walks on a designer or collection and receive only the new or changed pieces.
- **App and dashboard builders:** feed a clean, filterable rental catalog into your own tooling via the dataset API.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
|---|---|
| `recordId` | `joinswitch:12201` |
| `url` | `https://joinswitch.com/product/sample-piece-123` |
| `productId` | `12201` |
| `title` | `Sample Chain Flap Bag` |
| `brand` | `Sample Designer` |
| `brandSlug` | `sample-designer` |
| `category` | `Handbags` |
| `occasion` | `Wedding` |
| `shop` | `Vintage` |
| `tier` | `Select` |
| `retailValue` | `7000` |
| `memberPurchasePrice` | `5500` |
| `currency` | `USD` |
| `availability` | `available` |
| `isSoldOut` | `false` |
| `favoritesCount` | `168` |
| `notifyCount` | `95` |
| `isNew` | `false` |
| `description` | `Sample description text of the piece appears here.` |
| `condition` | `Condition note text appears here when fetchDetails=true.` |
| `imageUrl` | `https://img.example.com/sample-piece.png` |
| `imageUrls` | `["https://img.example.com/sample-piece.png"]` |
| `imageCount` | `1` |
| `dateAdded` | `2026-01-01 00:00:00` |
| `scrapedAt` | `2026-01-01T00:00:00Z` |

Piece rows also carry `sku`, `slug`, `isFeatured`, `metaTitle`, `descriptionText`, `imageUrlHover`, `updatedAt` and, in incremental mode, `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt`.

### How to Use

1. Pick a mode: search the catalog, or paste Switch URLs.
2. In search mode, set search terms and the catalog filters you want (brand, category, occasion, collection, tier, availability, sort). Leave search terms empty to browse the whole catalog.
3. Set Max items. 20 is the default; set 0 for unlimited.
4. Run the actor and export the dataset as JSON, CSV or Excel, or read it through the API.

**Search by keyword:**

```json
{
    "mode": "search",
    "searchTerms": ["chanel flap bag"],
    "fetchDetails": true,
    "maxItems": 50
}
```

**Browse one designer's handbags, available now, priciest first:**

```json
{
    "mode": "search",
    "searchTerms": [],
    "brands": ["Hermes"],
    "categories": ["handbags"],
    "availability": "available",
    "sort": "price-desc",
    "maxItems": 100
}
```

**Walk catalog URLs you already have:**

```json
{
    "mode": "url",
    "urls": [
        "https://joinswitch.com/product/chanel-matelasse-chain-flap-bag-1731355475",
        "https://joinswitch.com/collections/designer/chanel/handbags"
    ],
    "maxItems": 100
}
```

**Daily watch on a designer (incremental mode):**

```json
{
    "mode": "search",
    "searchTerms": [],
    "brands": ["Chanel"],
    "incrementalMode": true,
    "stateKey": "chanel-watch",
    "maxItems": 0
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/joinswitch-rental-scraper").call(run_input={
    "mode": "search",
    "searchTerms": ["chanel flap bag"],
    "maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["retailValue"], item["availability"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/joinswitch-rental-scraper').call({
    mode: 'search',
    searchTerms: ['chanel flap bag'],
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].title, items[0].retailValue);
```

You can also export the dataset to Make, Zapier, n8n, Google Sheets or a webhook from the Integrations tab of the actor.

#### How `maxItems` shapes a run

Max items is the single binding cap: the walk stops as soon as it has collected that many pieces across all search terms and URLs, whatever the page depth. Set 0 to walk to the natural end of the catalog (roughly 4,800 pieces today). Each catalog page carries 66 pieces, so a 100-piece run reads two pages plus the piece pages when details are on.

#### Resume and recurring updates

Resume from a previous run continues ONE interrupted crawl: paste its run ID and the walk skips pieces already collected there. Incremental mode is for scheduled monitoring of the same walk: the first run returns everything as NEW, later runs return only NEW, UPDATED and REAPPEARED pieces, and availability flips count as real changes (that is the signal on a rental catalog). Member counters (favorites, restock watches) and the store's own sync stamps are excluded from change detection by default; tune the list with the ignore-fields input.

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

Optionally pipe results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API and Integrations, then select it in the `mcpConnectors` input and set `notionParentPageUrl` for Notion. Each connector receives a condensed summary per piece (title, brand, tier, retail value, availability and the piece link), not the full record; the complete record always stays in the dataset. `maxNotifyListings` caps how many records each connector receives per run. Leaving the connector fields empty changes nothing about the dataset output.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | Search the catalog by keyword and filters, or process pasted Switch URLs. |
| `searchTerms` | array | `["chanel bag"]` | One or more keyword searches, run independently. Leave empty to browse the whole catalog. Search mode only. |
| `brands` | array | empty | Designer filter, by plain name, slug or store id. Several allowed. Search mode only. |
| `categories` | array | empty | Piece category filter: handbags, necklaces, earrings, bracelets, rings, belts, brooches, other. Search mode only. |
| `occasions` | array | empty | Occasion filter: everyday, festival, night-out, vacation, wedding. Search mode only. |
| `shop` | select | any | The store's own collection: fine, fashion, statement, everyday or vintage. Search mode only. |
| `tier` | select | `any` | Restrict to Core or Select pieces. Search mode only. |
| `availability` | select | `any` | Restrict to pieces on the shelf right now. Search mode only. |
| `sort` | select | `recommended` | Server-side ordering: recommended, newest, highest or lowest retail value first. |
| `urls` | array | empty | Piece, catalog, search and designer links in URL mode; every link shape the site uses is accepted. URL mode only. |
| `minRetailValue` | number | empty | Keep only pieces worth at least this much, in US dollars. Applies in both modes. |
| `maxRetailValue` | number | empty | Keep only pieces worth at most this much, in US dollars. Applies in both modes. |
| `fetchDetails` | checkbox | `true` | Read each piece's own page for the full gallery and fresh availability and prices; adds a per-record surcharge. |
| `maxItems` | integer | `20` | The single cap on the run across all search terms and URLs. 0 means unlimited. |
| `maxPages` | integer | `0` | Safety bound on result pages per source. 0 means no page limit. |
| `proxy` | object | Apify proxy | Leave the default; residential is recommended for the most reliable large runs. |
| `resumeFromRunId` | string | empty | Continue one interrupted run, skipping pieces it already collected. |
| `incrementalMode` | checkbox | `false` | For scheduled runs of the same walk: return only NEW, UPDATED and REAPPEARED pieces. |
| `stateKey` | string | empty | Name a monitoring campaign so its state stays stable across runs. |
| `emitUnchanged` | checkbox | `false` | Also return unchanged pieces, marked UNCHANGED (returns and bills extra rows). |
| `emitExpired` | checkbox | `false` | Also return pieces no longer in the catalog, marked EXPIRED (returns and bills extra rows). |
| `ignoreFieldsForChanges` | array | empty | Extra field names to exclude from incremental change detection. |
| `mcpConnectors` | array | empty | Send results into Notion, Linear, Airtable or Apify via MCP connectors. |
| `notionParentPageUrl` | string | empty | Notion parent page for the Notion connector. |
| `maxNotifyListings` | integer | `50` | Cap on records written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

**One piece record with details on:**

```json
{
    "recordId": "joinswitch:12201",
    "url": "https://joinswitch.com/product/sample-chain-flap-bag-123",
    "productId": "12201",
    "slug": "sample-chain-flap-bag-123",
    "title": "Sample Chain Flap Bag",
    "brand": "Sample Designer",
    "brandSlug": "sample-designer",
    "category": "Handbags",
    "occasion": "Everyday",
    "shop": "Vintage",
    "tier": "Select",
    "retailValue": 7000,
    "memberPurchasePrice": 5500,
    "currency": "USD",
    "availability": "available",
    "isSoldOut": false,
    "favoritesCount": 168,
    "notifyCount": 95,
    "description": "<li>Sample description line one.</li><li>Sample line two.</li>",
    "descriptionText": "Sample description line one. Sample line two.",
    "condition": "Condition note text appears here.",
    "authenticity": "Authenticity note text appears here.",
    "imageUrl": "https://img.example.com/sample-piece.png",
    "imageUrlHover": "https://img.example.com/sample-piece-2.png",
    "imageUrls": ["https://img.example.com/sample-piece.png"],
    "imageCount": 2,
    "sku": "12201",
    "dateAdded": "2026-01-01 00:00:00",
    "updatedAt": "2026-01-01 00:00:00",
    "scrapedAt": "2026-01-01T00:00:00Z"
}
```

### Plan Requirement

This actor runs on any paid Apify plan; the default connection is included with every plan, and the input recommends the most reliable option for large runs. Billing is per returned record, with a per-record surcharge when piece details are on, listed on the Pricing tab.

### FAQ

#### How much does it cost?

You pay per returned record (the Pricing tab lists the exact tiered price) plus a smaller per-record surcharge when Fetch piece details is on, and the run's normal Apify compute and proxy usage. A 20-piece default run with details on is a few tenths of a cent in event charges; Max items is the lever that bounds a run.

#### Is it legal to scrape Switch?

This actor reads only publicly available catalog pages. You remain responsible for using the data in line with the site's terms, applicable privacy law such as GDPR or CCPA, and your own use case. Personal data is not the target here: records describe products, not people.

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

Yes. Turn on Incremental mode (optionally with a State key to name the campaign). The first run classifies everything NEW; later runs return only NEW, UPDATED and REAPPEARED pieces, so a daily watch is cheap. Availability flips and price moves are reported as UPDATED on purpose.

#### Why did a run return fewer pieces than Max items?

The walk stops at the natural end of the results for your filters. A narrow filter set (one designer, one category) may simply have fewer pieces than the cap. Set Max items to 0 to walk everything the filters match.

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

If the catalog could not be read at all (a refused connection on every attempt), the run fails loudly instead of reporting an empty success: check the run log and try again shortly. A run that read the catalog and genuinely matched nothing succeeds quietly with zero items.

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

Yes. The dataset is plain JSON an agent can read, and the actor ships an MCP connector input so results can be written straight into Notion, Airtable, Linear or Apify from the same run.

### 🔗 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/therealreal-scraper"><b>The RealReal Scraper</b></a><br>Scrape luxury consignment listings from therealreal.com. Browse by designer, category or...</td><td>🧩 <a href="https://apify.com/abotapi/ssense-product-scraper"><b>SSENSE Scraper</b></a><br>Scrape SSENSE by keyword, category, designer or URL. Every row carries the selling price...</td></tr>
<tr><td>👗 <a href="https://apify.com/abotapi/24s-com-scraper"><b>24S Scraper</b></a><br>Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price...</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>
<tr><td>🧩 <a href="https://apify.com/abotapi/toogoodtogo-surprise-bag-scraper"><b>Too Good To Go Scraper</b></a><br>Scrape Too Good To Go (TGTG) stores and surprise bags by location or item: price, value...</td><td>🏷️ <a href="https://apify.com/abotapi/chrono24-scraper"><b>Chrono24 Scraper</b></a><br>Scrape Chrono24 luxury watch listings by keyword, filters or URL. Extract 50+ fields...</td></tr>
</table>

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

### 💬 Support & custom scrapers

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

# Actor input Schema

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

How to start the scrape. 'search' runs catalog searches with the filters below. 'url' processes the Switch URLs you paste: a piece URL returns that single piece in full, and a catalog or designer URL is paged like a browse, its own path deciding the scope.

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

One or more things to search for, for example 'chanel flap bag', 'diamond studs', 'hermes'. Each term is scraped independently. Leave empty to browse the whole catalog. Search mode only.

## `brands` (type: `array`):

Restrict the walk to these designers, given as plain names ('Chanel', 'Hermes'), slugs ('chanel') or the store's brand ids. Several brands are allowed and combine with every other filter. Names are matched against the store's own designer list at run start; a name that matches nothing fails the run with the unmatched names listed. Search mode only.

## `categories` (type: `array`):

Restrict the walk to these piece categories, by slug or name: handbags, necklaces, earrings, bracelets, rings, belts, brooches, other. Several are allowed. The store cannot combine keyword search with category filters, so when both are set the keyword decides and this filter is ignored for search walks (a clear note is logged). Search mode only.

## `occasions` (type: `array`):

Restrict the walk to pieces tagged for these occasions: everyday, festival, night-out, vacation, wedding. Several are allowed. Search mode only.

## `shop` (type: `string`):

Restrict the walk to one of the store's own collections: fine, fashion, statement, everyday or vintage. Search mode only.

## `tier` (type: `string`):

Restrict the walk to one membership tier. Core pieces carry an average retail value around $1,000; Select pieces around $4,000. 'any' sends no tier filter. Search mode only.

## `availability` (type: `string`):

'available' restricts the walk to pieces that are on the shelf right now (not checked out by another member). 'any' returns every catalog piece, checked out or not, with its availability field telling you which is which. Search mode only.

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

The store's own server-side ordering, sent with every page of every search walk: 'recommended' (most loved, the store default), 'newest', 'price-desc' (highest retail value first) or 'price-asc' (lowest first). A pasted URL decides its own ordering when it carries a sort parameter. Search mode only.

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

Paste Switch URLs; every link shape the site uses is accepted. Piece links look like /product/chanel-matelasse-chain-flap-bag-1731355475. Catalog links look like /collections?search=chanel\&page=2 (the page number starts that walk further in), /collections?brand=10\&category=10\&sort=PRICE_DESC, or designer pages like /collections/designer/chanel and /collections/designer/chanel/handbags. A pasted URL decides its own scope: a piece URL returns that one piece in full, a catalog or designer URL is paged forward from the page in the link. Site pages that are not catalog pages (home, membership, FAQ) are skipped with a note.

## `minRetailValue` (type: `number`):

Only keep pieces whose retail value is at least this amount, in US dollars. Applied to the rows this run reads. Applies in BOTH search mode and URL mode.

## `maxRetailValue` (type: `number`):

Only keep pieces whose retail value is at most this amount, in US dollars. Applied to the rows this run reads. Applies in BOTH search mode and URL mode.

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

Fetch each piece's own page for the full image gallery and to refresh availability, prices and favorite counts against the live listing. Slower, and charged once per record. Leave off for a fast crawl: every row still carries the card fields (title, brand, category, retail value, member buy price, tier, availability and the lead image).

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

The single cap on this run: stop after collecting this many records across all search terms and URLs. Set 0 for unlimited.

## `maxPages` (type: `integer`):

Safety bound on how many result pages to walk per search term or URL. Leave empty (0) for no page limit: the run then stops at Max items, not here. Does not impose a separate cap below Max items.

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

Leave the default for the cheapest run. The catalog is served over ordinary shared connections; Residential is recommended for the most reliable results on large or frequent runs. If a run reports it could not read any pages, try residential before anything else.

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

Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead.

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

Turn this on for daily or weekly recurring monitoring of the same catalog walk, for example a watch on one designer. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Availability flips, price moves and new pieces ARE reported as UPDATED or NEW: on a rental catalog that is the signal, not noise. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per search, URL and filter setup; use State key to name or deliberately share a monitoring campaign.

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

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search terms, URLs and filters, so two different walks never mix state.

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

Off by default. Turn on to also return pieces that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run.

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

Off by default. Turn on to also return pieces that were present in a previous run but are no longer in the catalog, marked EXPIRED. Only produced once a run has fully scanned the tracked walk: not when Max items capped it, not when Resume was used, and not when the run was refused. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.

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

Optional. Extra top-level field names to exclude from incremental change detection, on top of the built-in list (favoritesCount, notifyCount, updatedAt, inventoryUpdatedOn, imageUrls). Use when a field moves every run without the piece changing.

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

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API and Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

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

URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors.

## `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"
  ],
  "brands": [],
  "categories": [],
  "occasions": [],
  "tier": "any",
  "availability": "any",
  "sort": "recommended",
  "urls": [
    "https://joinswitch.com/product/chanel-matelasse-chain-flap-bag-1731355475",
    "https://joinswitch.com/collections?search=chanel",
    "https://joinswitch.com/collections/designer/hermes/handbags"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `changes` (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"
    ],
    "brands": [],
    "categories": [],
    "occasions": [],
    "shop": "",
    "tier": "any",
    "availability": "any",
    "sort": "recommended",
    "urls": [
        "https://joinswitch.com/product/chanel-matelasse-chain-flap-bag-1731355475",
        "https://joinswitch.com/collections?search=chanel",
        "https://joinswitch.com/collections/designer/hermes/handbags"
    ],
    "fetchDetails": true,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/joinswitch-rental-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"],
    "brands": [],
    "categories": [],
    "occasions": [],
    "shop": "",
    "tier": "any",
    "availability": "any",
    "sort": "recommended",
    "urls": [
        "https://joinswitch.com/product/chanel-matelasse-chain-flap-bag-1731355475",
        "https://joinswitch.com/collections?search=chanel",
        "https://joinswitch.com/collections/designer/hermes/handbags",
    ],
    "fetchDetails": True,
    "maxItems": 20,
    "proxy": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/joinswitch-rental-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"
  ],
  "brands": [],
  "categories": [],
  "occasions": [],
  "shop": "",
  "tier": "any",
  "availability": "any",
  "sort": "recommended",
  "urls": [
    "https://joinswitch.com/product/chanel-matelasse-chain-flap-bag-1731355475",
    "https://joinswitch.com/collections?search=chanel",
    "https://joinswitch.com/collections/designer/hermes/handbags"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/joinswitch-rental-scraper --silent --output-dataset

```

## MCP server setup

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