# Catawiki Scraper (`crawloop/catawiki-scraper`) Actor

Scrape Catawiki auction lots for collectors and dealers. Export the current bid, closing time, reserve, expert estimate, and seller shop from public search and lot pages.

- **URL**: https://apify.com/crawloop/catawiki-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 lots

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

## Catawiki Scraper

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Catawiki B.V. or its affiliates. Data is read from publicly accessible search, category, auction, and lot pages only. No login and no bidding. You are responsible for complying with applicable law (including GDPR where a seller shop name appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

Scrape **Catawiki** auction lots. Export the **current bid**, **closing time**, **reserve**, **expert estimate** when the lot page has one, and the **seller shop**. One Catawiki scraper for collectors, dealers, and resale research. It is a Catawiki API alternative for the public catalog: the same rows in JSON or CSV, from Python, Node.js, or an AI assistant over MCP.

**Best for:** watch, art, jewellery, coin, and collectible buyers who want auction rows they can filter, schedule, and compare.

> **Crawloop auction and resale suite** — Catawiki lots, then sold comps and specialist auctions for the same object.

| Catawiki | Specialist auctions | Marketplace sold | Live resale |
| :--- | :--- | :--- | :--- |
| **Catawiki Scraper** ◄── you are here | [Goldin Scraper](https://apify.com/crawloop/goldin-scraper) | [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) | [Whatnot Listings Scraper](https://apify.com/crawloop/whatnot-listings-scraper) |
| Current bid, close time, reserve, estimate | Live and sold auction rows | Completed marketplace sales | Live shop listings |
| [Heritage Auctions Scraper](https://apify.com/crawloop/heritage-auctions-scraper) | [PriceCharting Scraper](https://apify.com/crawloop/pricecharting-scraper) | [The RealReal Listings Scraper](https://apify.com/crawloop/the-realreal-listings-scraper) | |
| Live bids and archive cards | Price guide rows | Luxury resale listings | |

### When to use this Actor

- **Live lot watch** — current bid, next bid, and closing time on lots that are still open
- **Reserve check** — whether a reserve is set, and whether the page says it is met
- **Expert estimate** — low and high estimate when the lot page publishes one
- **Seller shop** — public shop name, country, and reputation score
- **Scheduled new-lot monitor** — `monitorMode` on an Apify Schedule so repeat runs only charge lot ids you have not already stored
- **Category or auction pull** — paste a category or auction URL instead of a keyword

### When not to use this Actor

- **Sold marketplace comps** — use [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) for completed sales of the same watch, card, or object
- **US specialist auctions** — use [Goldin Scraper](https://apify.com/crawloop/goldin-scraper) or [Heritage Auctions Scraper](https://apify.com/crawloop/heritage-auctions-scraper)
- **Live shopping shows** — use [Whatnot Listings Scraper](https://apify.com/crawloop/whatnot-listings-scraper)
- **Placing bids or logging in** — this Actor only reads public auction data

### Key features

- **Keyword, category, auction, and lot URL** in one Actor
- **Current bid from the lot page**, plus closing time, reserve, and seller shop
- **Expert estimate** when the lot page includes one. Many lots leave it empty
- **Monitor mode** stores seen lot ids in a named key-value store and skips them on the next run
- **HTTP catalog** — no browser. Leave proxy off unless a run starts returning HTTP 403
- **Related filler lots are dropped** and are not charged
- **Deduped rows** across several searches in the same run

### Input

| Field | Required | Description |
| :--- | :--- | :--- |
| `searchQueries` | No | Keywords such as `rolex` or `art deco lamp`. Each keyword is its own search |
| `startUrls` | No | Search, category, auction, or lot URL. A lot URL returns that lot |
| `locale` | No | `en` (default), `nl`, `de`, `fr`, `es`, or `it`. A pasted URL keeps the language in its path |
| `currency` | No | `EUR` (default), `USD`, or `GBP`. The saved bid is the amount on the lot page |
| `sort` | No | `best_match` (default), `ending_soon`, or `newest` for keyword searches |
| `maxItems` | No | Cap across the whole run. Default 20. Each saved row opens that lot page |
| `maxPages` | No | Catalog pages per keyword, category, or auction. Default 5. 24 lots per page |
| `monitorMode` | No | Charge only lot ids not seen in the named store |
| `monitorStoreName` | No | Key-value store name. One name per watch |
| `resetMonitorState` | No | Clear seen ids before this run |
| `proxyConfiguration` | No | Leave off |

```json
{
  "searchQueries": ["rolex submariner"],
  "locale": "en",
  "currency": "EUR",
  "sort": "ending_soon",
  "maxItems": 20
}
```

A single lot:

```json
{
  "startUrls": [
    { "url": "https://www.catawiki.com/en/l/107740761-rolex-datejust" }
  ],
  "maxItems": 1
}
```

### Output

| Field | Description |
| :--- | :--- |
| `lotId` | Catawiki lot id |
| `title` / `subtitle` / `summary` | Public lot text |
| `currentBid` / `currency` | Current bid and its currency |
| `minNextBid` / `startingBid` | Next bid and opening bid |
| `biddingStartTime` / `biddingEndTime` | Open and close, UTC |
| `reservePriceSet` / `reservePriceMet` | Reserve flag, and whether the page says it is met |
| `closed` / `sold` | Bidding state |
| `buyNow` / `buyNowAmount` | Buy-now when the page offers it |
| `estimateLow` / `estimateHigh` | Expert estimate when published |
| `expertName` | Catalog expert |
| `sellerName` / `sellerUrl` / `sellerScore` / `sellerCountryCode` | Public shop. Street address and legal entity are not saved |
| `specs` | Specification name and value pairs |
| `auctionTitle` / `url` / `imageUrl` | Auction name, lot link, and lead photo |

```json
{
  "lotId": "107740761",
  "title": "Rolex - Datejust - No reserve price - 6917 - Women - 1990-1999",
  "currentBid": 1350,
  "currency": "EUR",
  "minNextBid": 1450,
  "biddingEndTime": "2026-10-25T19:52:00Z",
  "reservePriceSet": false,
  "sellerName": "blackgold",
  "sellerCountryCode": "it",
  "expertName": "Mauro Atienza",
  "url": "https://www.catawiki.com/en/l/107740761-rolex-datejust-no-reserve-price-6917-women-1990-1999"
}
```

### Use cases

- **Watch dealer comps** — open Rolex lots with the current bid and close time, then the same reference on eBay sold
- **Ending-soon watch** — sort by `ending_soon` and keep lots that close today
- **No-reserve filter** — `reservePriceSet` false on art, coins, or jewellery
- **Morning monitor** — a schedule that only returns lot ids you have not already stored
- **Seller shop review** — public shop name, country, and reputation next to the bid

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('crawloop/catawiki-scraper').call({
  searchQueries: ['rolex submariner'],
  sort: 'ending_soon',
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
  console.log(item.title, item.currentBid, item.currency, item.biddingEndTime);
}
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="YOUR_TOKEN")
run = client.actor("crawloop/catawiki-scraper").call(run_input={
    "searchQueries": ["rolex submariner"],
    "sort": "ending_soon",
    "maxItems": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("currentBid"), item.get("currency"))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~catawiki-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["rolex submariner"],"sort":"ending_soon","maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store ID `crawloop/catawiki-scraper`.

Example prompts:

- "Run Catawiki Scraper for rolex submariner, ending soon, max 20, and return title, currentBid, currency, biddingEndTime, reservePriceSet as JSON"
- "Scrape Catawiki lots for art deco lamp and summarize bids that close in the next two days"
- "Chain Catawiki Scraper then [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) for the same Rolex reference"

### Suite next step

After a Catawiki bid, run [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) for marketplace comps on the same object. For cards and memorabilia, continue with [Goldin Scraper](https://apify.com/crawloop/goldin-scraper) or [Heritage Auctions Scraper](https://apify.com/crawloop/heritage-auctions-scraper). For a price-guide check, use [PriceCharting Scraper](https://apify.com/crawloop/pricecharting-scraper).

### FAQ

**Does this Catawiki scraper log in or place bids?**
No. It reads public search, category, auction, and lot pages.

**Is the current bid on the search card?**
The catalog list does not include the live bid. Each saved row opens the lot page and stores the bid shown there.

**Why is the expert estimate empty?**
Many lots do not publish an estimate. The fields stay empty instead of a guessed number.

**What does monitor mode charge?**
A later run charges only lot ids that were not stored in the named key-value store. A page that is already entirely known stops that search, so an empty tick does not open lot pages.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords such as rolex submariner or art deco lamp. Each keyword is its own search.

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

A search URL, category URL, auction URL, or lot URL. Lot URLs return one lot each.

## `locale` (type: `string`):

Language for keyword searches. A pasted URL keeps the language in its path.

## `currency` (type: `string`):

Currency requested from the catalog. The saved bid uses the amount shown on the lot page.

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

Order for keyword searches. Category and auction URLs keep the site order.

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

Maximum lot rows to save across every search. Each saved row opens that lot page for the current bid.

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

How many catalog pages to read for each keyword, category, or auction. 24 lots per page.

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

Save and charge only lot ids that were not seen in a previous run. Pair with an Apify Schedule and a stable monitor store name. A page that is already known stops that search.

## `monitorStoreName` (type: `string`):

Named key-value store for seen lot ids. Use one name per watch.

## `resetMonitorState` (type: `boolean`):

Clear seen lot ids before this run.

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

Leave proxy off. Search and lot pages respond without a proxy. Turn a proxy on only if a run fails with HTTP 403.

## Actor input object example

```json
{
  "searchQueries": [
    "rolex"
  ],
  "locale": "en",
  "currency": "EUR",
  "sort": "best_match",
  "maxItems": 20,
  "maxPages": 5,
  "monitorMode": false,
  "monitorStoreName": "catawiki-monitor",
  "resetMonitorState": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "searchQueries": [
        "rolex"
    ],
    "locale": "en",
    "currency": "EUR",
    "sort": "best_match",
    "maxItems": 20,
    "maxPages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/catawiki-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 = {
    "searchQueries": ["rolex"],
    "locale": "en",
    "currency": "EUR",
    "sort": "best_match",
    "maxItems": 20,
    "maxPages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/catawiki-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 '{
  "searchQueries": [
    "rolex"
  ],
  "locale": "en",
  "currency": "EUR",
  "sort": "best_match",
  "maxItems": 20,
  "maxPages": 5
}' |
apify call crawloop/catawiki-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/catawiki-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/sc6XfqKLKCarRkwkq/builds/diXhrMU3KWQgKFIqZ/openapi.json
