# The Saleroom Scraper - Auction Lots, Estimates & Premiums (`scrapersdelight/the-saleroom-scraper`) Actor

Scrape auction lots from the-saleroom.com: title, estimate, current bid, images, sale dates, buyer's premium, auction house phone and email. Search by keyword, category, house, country, estimate or postcode, paste catalogue links (closed lots with Sold/Passed status) or monitor new lots.

- **URL**: https://apify.com/scrapersdelight/the-saleroom-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** E-commerce, Lead generation, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.70 / 1,000 per lot returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does The Saleroom Scraper do?

**The Saleroom Scraper** exports auction lots from [the-saleroom.com](https://www.the-saleroom.com), the online bidding marketplace where some 700 auction houses (the site's own figure) list their sales - 72% of the indexed lots from UK sales and 12% from German ones on 2026-10-14 (antiques, fine art, jewellery, watches, coins, collectables, furniture). Each row is one lot: title, full description, estimate, current bid, images, the auction and its dates, the buyer's premium, and the auction house with its phone and email. Built for dealers, collectors, price researchers and anyone who sells to auction houses.

The Saleroom scraper · the-saleroom.com API · UK auction lots scraper · antiques auction data

- **Search like the site does:** keyword, category and sub-category, auction house, sale type, country, brand, item type, estimate range, "listed since", auction dates, and the site's own "within X miles of a postcode" filter.
- **Paste any link:** a search with its filters, a category page, an auction catalogue (every lot, including the ones that already closed), an auction house (its open lots, or `?Auctions=past` for its past sales) or single lots.
- **Auction details on every row:** buyer's premium and online commission (inc. VAT), sale days with their lot ranges, venue address and postcode, and the auction house's phone and email - read once per auction.
- **Lot details on demand:** lot status (`Sold`, `Passed`, `WaitingToBeOffered` ...), opening price, every image and the total buyer fees % from each lot page.
- **Current lots only by default:** the site's search index still holds lots of auctions that ended long ago (61,062 of 235,999 indexed lots on 2026-10-14, "Lot - Expired" on the site); they are left out unless you ask for them.
- **Monitor mode:** deliver only lots no earlier run delivered - schedule it daily for new-lot alerts.
- **No login, cookies or API key.** Export to JSON, CSV or Excel; schedules, webhooks, Make, Zapier, n8n, Google Sheets; Apify API and MCP.

### What data can you get from the-saleroom.com?

<table>
<tr><td>🔢 Lot id, number, link (<code>url</code>)</td><td>📝 Title, full description</td><td>🩺 Condition report (when written)</td></tr>
<tr><td>💷 Low / high estimate, currency</td><td>🔨 Current bid, next bid, bids count</td><td>👀 Watchers count</td></tr>
<tr><td>🏷️ Opening price, buy-it-now price</td><td>📌 Lot status: Sold / Passed / ...</td><td>💰 Buyer's premium %, online commission %</td></tr>
<tr><td>📸 Main image + every image</td><td>🗂️ Category, sub-category, sale section</td><td>🏷️ Brands / makers, item types</td></tr>
<tr><td>📅 Auction title, type, start, end, sale days</td><td>⏱️ Lot closing time (timed sales)</td><td>🧾 Auction status, lot count</td></tr>
<tr><td>🏛️ Auction house name and link</td><td>☎️ House phone and email</td><td>📍 Venue address, postcode, GPS</td></tr>
</table>

### How to scrape the-saleroom.com with The Saleroom Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - the free plan includes monthly credit.
2. Open **The Saleroom Scraper**.
3. Type search terms (`pocket watch`, `Moorcroft`, `Banksy`), paste links from the-saleroom.com, or set filters (category, house, country, estimate, postcode).
4. Set **Maximum lots** and click **Start**.
5. Download the lots as JSON, CSV or Excel, or send them to your tools.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| `searchTerms` | list | The site's lot search, one search per term. Prefilled with `pocket watch`. |
| `startUrls` | list | Links from the-saleroom.com: search, category, catalogue, auction house, lot. |
| `masterCategory` | select | Top-level category (Fine Art, Collectables, Clocks, Watches & Jewellery, ...). |
| `categoryCodes` | list | Sub-category codes or names (`CLK` or `Clocks`, `WAT`, `SIL`, `COI`, ...). |
| `auctionHouses` | list | House names as the site shows them (`Bonhams`, `Fellows`). |
| `auctionTypes` | multi-select | Live, Timed, Catalogue Live, Catalogue Timed, Tender. |
| `countries` | multi-select | Country of the sale (19 on the site). |
| `brands`, `itemTypes` | list | The site's Brand and Item filters (`Rolex`; `Bracket Clock`). |
| `minEstimate`, `maxEstimate` | integer | Estimate range, in the sale's currency. |
| `listedSince` | text | `24 hours`, `7 days` or a date. |
| `auctionDateFrom`, `auctionDateTo` | date | Auction start date window. |
| `nearPostcode`, `postcodeCountry`, `radiusMiles` | text / select | The site's location filter (10-500 miles). |
| `imagesOnly`, `exactMatch` | boolean | The site's "Lots with images" and "Exact matches only". |
| `sort` | select | Relevance, Auction date, High estimate, Low estimate, Auction house, Most recently listed. |
| `includeEndedAuctions` | boolean | Default off: lots of auctions that ended more than a day ago are skipped. |
| `excludeKeywords`, `onlyWithEstimate` | list / boolean | Drop lots after reading; dropped lots are not charged. |
| `includeAuctionDetails` | boolean | Default on: premium, commission, sale days, venue, house phone/email. |
| `includeAuctionHouseDetails` | boolean | House address and profile text. |
| `includeLotDetails` | boolean | Lot status, opening price, all images, total fees % (one page per lot). |
| `includeClosedLots` | boolean | Default on: closed lots of a pasted catalogue link. |
| `monitorMode`, `monitorKey` | boolean / text | Only lots not delivered by an earlier run. |
| `maxItems` | integer | Default 100; 0 = no limit. |
| `maxItemsPerSearch`, `compact`, `descriptionMaxLength` | integer / boolean | Per-search cap, core-fields-only rows, description length. |
| `proxyConfiguration`, `maxConcurrency` | proxy / integer | Not needed in normal use. |

#### Input JSON

```json
{
  "searchTerms": ["pocket watch", "barometer"],
  "countries": ["United Kingdom"],
  "minEstimate": 200,
  "includeAuctionDetails": true,
  "maxItems": 200
}
```

#### Paste a catalogue link to get the whole sale

A catalogue link (`/auction-catalogues/<house>/catalogue-id-<id>`) returns every lot of that auction in catalogue order - open lots with their full record, closed lots from the catalogue's own pages. Measured: 1,953 of 1,953 lots of a four-day sale (1,341 open, 612 already closed) in 31 seconds. Add **Lot details** to get `Sold` / `Passed` for the closed ones.

#### Use filters or a link, not both

A pasted search link brings its own filters (the same parameters the site puts in its address bar); the form filters apply to search terms and to runs with no links.

### ⬆️ Output

One row per lot. A real row from a verified run (search `silver`, all extra data on; 31 of 66 fields shown):

```json
{
  "lotId": "538411e8-36d3-470c-aee6-b4de010cfcca",
  "lotNumber": "390",
  "title": "Wonderful quality Asprey & Co cast silver fox hound head snuff box, with gilt interior, London 1971,",
  "estimateLow": 100,
  "estimateHigh": 200,
  "currency": "GBP",
  "currentBid": 120,
  "nextBid": 130,
  "openingPrice": 60,
  "watchersCount": 35,
  "lotStatus": "WaitingToBeOffered",
  "feesPercent": 29.94,
  "auctionId": "john-r1-10046",
  "auctionTitle": "Cream of the Crop - Jewellery, Silver, Watches, Objets D'Art",
  "auctionType": "Live",
  "auctionStartAt": "2026-10-17T09:00:00.000Z",
  "buyersPremiumPercent": 24,
  "onlineCommissionPercent": 5.94,
  "auctionHouse": "John Rolfe Auctions",
  "auctionHousePhone": "01666 848398",
  "auctionHouseEmail": "info@johnrolfeauctions.com",
  "location": "Tetbury, Gloucestershire",
  "venuePostcode": "GL8 8YL",
  "category": "Silver & Silver-plated items",
  "brands": ["Silver", "Asprey of London"]
}
```

#### Fields and how often they are filled

Fill rates from a 100-lot search run (`silver`, default settings) and a 50-lot run with every extra on:

| Field | Fill | Field | Fill |
|---|---|---|---|
| `lotId`, `url`, `lotNumber`, `title`, `description` | 100% | `auctionTitle`, `auctionType`, `auctionStartAt`, `auctionEndAt` | 100% |
| `estimateLow` / `estimateHigh` | 98% | `buyersPremiumPercent` | 96% |
| `currency`, `imageUrl`, `imageCount` | 100% | `onlineCommissionPercent` | 100% |
| `currentBid` (lots with a bid) | 12% | `auctionHousePhone`, `auctionHouseEmail` | 100% |
| `nextBid` | 59% | `venueAddress`, `venuePostcode`, `location` | 94% |
| `bidsCount`, `watchersCount` | 100% | `saleDays` | 94% |
| `category`, `masterCategory`, `country`, GPS | 100% | `auctionSubtitle` | 61% |
| `brands` / `itemTypes` | 100% | `lotEndAt` (timed lots only) | 6% |
| `lotStatus`, `images`, `feesPercent` (Lot details) | 100% | `openingPrice` (Lot details) | 60% |
| `auctionHouseAddress` (House profile) | 100% | `auctionHouseAbout` (House profile) | 36% |
| `conditionReport` | when the description has one (12% of 1,000 Fine Art lots) | `buyItNowPrice` | when offered (1,987 lots on the site) |

Field meanings are in the dataset schema (Output tab). Three views: **Lots**, **Auction & house**, **Lot details**.

### How can I use the-saleroom.com data?

- 🏺 **Dealers and pickers:** find lots in your speciality below a price, near you, and see the buyer's premium before you bid.
- 📈 **Price researchers:** track estimates, bids and Sold / Passed outcomes per category, maker or house.
- 🔔 **New-lot alerts:** a daily monitor run on your search terms sends only what was listed since yesterday.
- 🏛️ **Selling to auction houses:** house name, phone, email and address on every row, with what each house sells.
- 🛒 **Marketplace and catalogue builders:** structured lots with images and categories.
- 🤖 **AI agents:** compact rows for an LLM pipeline via the API or MCP.

### How much does it cost to scrape the-saleroom.com?

The Saleroom Scraper is priced per lot: **$0.0027 per lot** ($2.70 per 1,000 lots), with no start fee. Auction details, house details and lot details are included.

| Lots | Price |
|---|---|
| 20 | $0.054 |
| 100 | $0.27 |
| 1,000 | $2.70 |
| 10,000 | $27.00 |

Apify's free plan includes monthly credit. A search that matches nothing costs nothing.

### Integrations, API, scheduling and MCP

Run it on a [schedule](https://docs.apify.com/platform/schedules) (a daily monitor run is the usual setup), send results to Google Sheets, Slack, Make, Zapier or n8n with [integrations](https://docs.apify.com/platform/integrations), or trigger a webhook when a run finishes. Call it from code with the [Apify API](https://apify.com/scrapersdelight/the-saleroom-scraper/api) - [Python](https://apify.com/scrapersdelight/the-saleroom-scraper/api/python) or [JavaScript](https://apify.com/scrapersdelight/the-saleroom-scraper/api/javascript) - or let an AI agent call it through the [Apify MCP server](https://apify.com/scrapersdelight/the-saleroom-scraper/api/mcp).

### More auction scrapers

- [BidSpotter Auction Scraper](https://apify.com/scrapersdelight/bidspotter-auction-scraper) - industrial and machinery lots.
- [LiveAuctioneers Scraper](https://apify.com/scrapersdelight/liveauctioneers-scraper) - lots and prices realized.
- [Interencheres Scraper](https://apify.com/scrapersdelight/interencheres-auction-scraper) - French auction lots, hammer prices and houses.
- [Drouot Scraper](https://apify.com/scrapersdelight/drouot-lot-scraper) - lots, sales and house contacts from drouot.com.
- [Auctionet Scraper](https://apify.com/scrapersdelight/auctionet-lot-scraper) - European lots with hammer prices.
- [HiBid Auction Scraper](https://apify.com/scrapersdelight/hibid-scraper) - US and Canadian lots and bids.

See [all our scrapers](https://apify.com/scrapersdelight).

### Limits and empty runs

- **Hammer prices are not in the rows:** the-saleroom.com shows them only to paid Price Guide subscribers ("Subscribe to the price guide" on every closed lot we checked). Closed lots carry `lotStatus` `Sold` or `Passed` instead (Lot details).
- Lot titles are cut at 100 characters by the site itself; `description` has the full text.
- Closed lots of a catalogue, read without Lot details, carry the catalogue card's description preview (`descriptionTruncated: true`).
- One search pages through up to 100,000 lots; a bigger one (e.g. every lot on the site) is split by auction date automatically.
- `RUN_SUMMARY` (key-value store) gives, per search: the site's own total, lots read and delivered, filtered and already-seen lots, links not found, and why the search stopped.
- An empty run (no match, a link not found) ends with nothing charged and says why in the status message.

### ❓ FAQ

#### How much does The Saleroom Scraper cost?

$0.0027 per lot with no start fee: 1,000 lots cost $2.70, auction and house details included.

#### How many lots can The Saleroom Scraper get?

Every lot the site's search returns. On 2026-10-14 the site indexed 235,999 open lots, 173,404 of them in auctions that had not ended. A 1,000-lot category run took 35 seconds in our tests.

#### Does The Saleroom Scraper return hammer prices?

No - on the-saleroom.com they are behind the paid Price Guide. Turn on Lot details to get `Sold` / `Passed` for closed lots.

#### Does The Saleroom Scraper give auction-house contacts?

Yes: phone and email on every row with Auction details on (100% in our test runs), plus address and profile text with Auction-house profile.

#### Can I paste a the-saleroom.com search link into The Saleroom Scraper?

Yes. Keyword, category, brand, item, country, house, sale type, estimate range, sort, images-only, exact match and the postcode filter are all read from the link.

#### Can I use The Saleroom Scraper for new-lot alerts?

Yes: turn on monitor mode and schedule the run daily. The second run of a search delivered 0 of 854 lots already sent and stopped after one page.

#### Can I use The Saleroom Scraper with the Apify API or MCP?

Yes - see the API tab for Python, JavaScript and HTTP examples, and the MCP tab for AI agents.

#### Do I need a the-saleroom.com account, login or API key?

No. The Saleroom Scraper reads the same public pages and search any visitor sees.

#### Why did The Saleroom Scraper return no lots?

The search matched nothing, every match was in an auction that ended (turn on Include ended auctions), or a link was not a lot, catalogue, house, category or search page - the status message and `RUN_SUMMARY` say which. Nothing is charged.

#### Your feedback

Found a bug or need a field? Open an issue on the [Issues tab](https://apify.com/scrapersdelight/the-saleroom-scraper/issues/open) - we answer every one.

# Actor input Schema

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

The site's own lot search, one search per term, e.g. "pocket watch", "Moorcroft", "Banksy". Leave empty (and add no links) to read every lot that matches the filters below.

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

Links from the-saleroom.com: a search (/search-results?searchterm=... with its filters), a category (/for-sale/fine-art), an auction catalogue (every lot, closed ones too), an auction house (its open lots; add ?Auctions=past for its past sales) or a single lot. A link brings its own filters.

## `masterCategory` (type: `string`):

The site's top-level category. Pair it with Sub-categories to narrow further.

## `categoryCodes` (type: `array`):

Sub-category codes or names, e.g. "CLK" or "Clocks", "WAT" (watches), "SIL" (silver), "COI" (coins). Several = any of them. The README lists all 154.

## `auctionHouses` (type: `array`):

Auction-house names exactly as the site shows them, e.g. "Bonhams", "Fellows", "Chiswick Auctions". Several = any of them.

## `auctionTypes` (type: `array`):

Live (bid during the sale), Timed (online, lots close one by one) and the site's other sale formats. Empty = all.

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

Country of the sale. Empty = all.

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

The site's Brand filter, e.g. "Rolex", "Royal Doulton", "Moorcroft", "Corgi". Several = any of them.

## `itemTypes` (type: `array`):

The site's Item filter, e.g. "Ring", "Bracket Clock", "Oil Painting", "Vase". Several = any of them.

## `minEstimate` (type: `integer`):

Lowest low estimate, in the sale's own currency (the site's Estimate filter).

## `maxEstimate` (type: `integer`):

Highest high estimate, in the sale's own currency.

## `listedSince` (type: `string`):

Only lots published on the site since this time: a date (2026-10-01) or a duration ("24 hours", "7 days"). Pairs well with a daily schedule.

## `auctionDateFrom` (type: `string`):

Only lots whose auction starts on or after this date.

## `auctionDateTo` (type: `string`):

Only lots whose auction starts on or before this date.

## `nearPostcode` (type: `string`):

The site's location filter: lots from sales within the radius below of this postcode, e.g. "SW1A 1AA", "BD23 6QR".

## `postcodeCountry` (type: `string`):

Country of the postcode above.

## `radiusMiles` (type: `string`):

Radius around the postcode, the site's own choices.

## `imagesOnly` (type: `boolean`):

The site's "Lots with images" filter.

## `exactMatch` (type: `boolean`):

The site's "Exact matches only" switch: no typo tolerance or word-prefix matching for the search terms.

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

The site's sort options. Monitor mode always reads newest listings first.

## `includeEndedAuctions` (type: `boolean`):

The site's search index still holds lots of auctions that ended long ago (about a quarter of it in October 2026; their pages say "Lot - Expired"). Off = only auctions that have not ended more than a day ago.

## `excludeKeywords` (type: `array`):

Drop lots whose title or description contains any of these words, e.g. "reproduction", "damaged". Dropped lots are not charged.

## `onlyWithEstimate` (type: `boolean`):

Skip lots the auctioneer published without an estimate.

## `includeAuctionDetails` (type: `boolean`):

Add each auction's buyer's premium and online commission (inc. VAT), sale days with lot ranges, status, lot count, venue address and the auction house's phone and email. One catalogue page per auction, shared by its lots.

## `includeAuctionHouseDetails` (type: `boolean`):

Add the auction house's full address, phone, email and profile text from its page on the site (one page per house).

## `includeLotDetails` (type: `boolean`):

Open each lot's page: lot status (Sold / Passed / WaitingToBeOffered ...), opening price, every image, total buyer fees % and the full description of closed lots. One page per lot, so slower.

## `includeClosedLots` (type: `boolean`):

For auction-catalogue links: also deliver lots that have already closed (read from the catalogue's own pages; turn on Lot details for their Sold / Passed status).

## `monitorMode` (type: `boolean`):

Deliver only lots that no earlier run of the same search delivered; newest listings are read first and the walk stops where the last run ended. Pairs with a daily schedule.

## `monitorKey` (type: `string`):

Optional name for the monitor's memory, e.g. "clocks-uk". Runs with the same name share one memory even if their inputs differ; empty = one memory per input.

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

Stop after this many lots in total. 0 = no limit (one search pages through up to 100,000 lots; bigger searches are split by auction date automatically).

## `maxItemsPerSearch` (type: `integer`):

Cap for each search term or link on its own. 0 = only the overall maximum applies.

## `compact` (type: `boolean`):

Core fields only (id, link, title, estimate, bid, auction, house, location, dates) - smaller rows for spreadsheets and AI pipelines.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters. 0 = full text.

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

Not needed: the actor reads the site directly and moves to Apify's proxies by itself only if the site refuses a request.

## `maxConcurrency` (type: `integer`):

Pages read at the same time for auction, house and lot details.

## Actor input object example

```json
{
  "searchTerms": [
    "pocket watch"
  ],
  "masterCategory": "",
  "postcodeCountry": "UK",
  "radiusMiles": "25",
  "imagesOnly": false,
  "exactMatch": false,
  "sort": "relevance",
  "includeEndedAuctions": false,
  "onlyWithEstimate": false,
  "includeAuctionDetails": true,
  "includeAuctionHouseDetails": false,
  "includeLotDetails": false,
  "includeClosedLots": true,
  "monitorMode": false,
  "maxItems": 20,
  "maxItemsPerSearch": 0,
  "compact": false,
  "descriptionMaxLength": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One item per auction lot.

## `summary` (type: `string`):

Per-search site totals, lots read / delivered / filtered / already seen, links not found, transport and paid-proxy stats.

# 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": [
        "pocket watch"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/the-saleroom-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": ["pocket watch"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/the-saleroom-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 '{
  "searchTerms": [
    "pocket watch"
  ],
  "maxItems": 20
}' |
apify call scrapersdelight/the-saleroom-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/the-saleroom-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/BajZRri6KBFtLpwgq/builds/JsuN4J7IV6Mwrd7px/openapi.json
