# Catawiki Scraper — Live Auction Bids & Closing Times (`studio-amba/catawiki-scraper`) Actor

Scrape auction lots from Catawiki.com, Europe's curated online auction marketplace for art, watches, jewellery, classic cars and collectibles. Get the current bid and exact closing time per lot — not just a static listing snapshot. Search by keyword or browse a full category. No login required.

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

## Pricing

from $5.00 / 1,000 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Catawiki Scraper

Scrape auction lots from [Catawiki.com](https://www.catawiki.com), Europe's curated online auction marketplace for art, watches, jewellery, classic cars, wine and collectibles — with the current bid and exact closing time on every lot, not just a static listing snapshot.

### Why use this actor?

Most Catawiki tools only read the listing page — a title, an image, and a URL. That tells you nothing about whether a lot is worth watching. This actor also opens each lot's detail page and pulls the live current bid, the exact closing time, reserve status, and seller info, so you can track price movement and time-to-close across a whole category or search without opening every lot by hand. Useful for auction sniping tools, price-trend dashboards, category monitoring, and sourcing for dealers who buy on Catawiki.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Free text keyword search (e.g. `"rolex"`, `"monet painting"`). Used when `categoryUrl` is not set. Default: `"watches"`. |
| `categoryUrl` | String | No | Full category URL to browse instead of a keyword search, e.g. `https://www.catawiki.com/en/c/333-watches`. Overrides `searchQuery` when set. |
| `maxResults` | Integer | No | Maximum number of lots to return. Default 100, max 500. |
| `fetchBidDetails` | Boolean | No | When true (default), fetches each lot's detail page for current bid, closing time, reserve status and seller info — this is the actor's core value versus a plain listing scrape. Turn off for a fast, cheap title/image/URL-only pull. |
| `brightDataApiKey` | String | No | Optional: your own Bright Data API key. Leave empty to use the built-in unlocking service. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `lotId` | Integer | `106256275` |
| `lotTitle` | String | `"Rolex - Oyster Perpetual - 177200 - Women - 2018"` |
| `subtitle` | String | `"Automatic - Steel"` |
| `brand` | String | `"Rolex"` |
| `description` | String | Full seller description |
| `summary` | String | Catawiki-generated one-line summary |
| `url` | String | Lot detail page URL |
| `imageUrl` | String | Primary lot image |
| `imageUrls` | Array | All lot images |
| `category` | String | `"Rolex Watches"` |
| `categoryPath` | Array | `["Watches, Pens & Lighters", "Watches", "Rolex Watches"]` |
| `currentBid` | Number | `4350` |
| `startingBid` | Number | `4550` |
| `minBidAmount` | Number | `4550` |
| `buyNowPrice` | Number | Instant-purchase price, when offered |
| `currency` | String | `"EUR"` |
| `reservePriceSet` | Boolean | `true` |
| `reservePriceMet` | Boolean | `false` |
| `sold` | Boolean | `false` |
| `closed` | Boolean | `false` |
| `auctionStatus` | String | `"open_now"` |
| `biddingStartTime` | String | ISO 8601 |
| `closingTime` | String | ISO 8601 — when the auction closes |
| `auctionId` | Integer | `1272940` |
| `auctionTitle` | String | `"Rolex Watches Auction"` |
| `auctionUrl` | String | Full auction page URL |
| `sellerName` | String | `"SwissOnly"` |
| `sellerCountry` | String | `"Lithuania"` |
| `sellerIsPro` | Boolean | `true` |
| `specs` | Object | Key-value spec table (movement, material, condition, year, etc.) |
| `scrapedAt` | String | ISO 8601 timestamp when this record was collected |

### Example output

```json
{
    "lotId": 106256275,
    "lotTitle": "Rolex - Oyster Perpetual - 177200 - Women - 2018",
    "subtitle": "Automatic - Steel",
    "brand": "Rolex",
    "url": "https://www.catawiki.com/en/l/106256275-rolex-oyster-perpetual-177200-women-2018",
    "imageUrl": "https://assets.catawiki.nl/assets/2026/7/15/7/6/7/76706c9c-757b-4236-8473-2554ea202732.jpg",
    "category": "Rolex Watches",
    "categoryPath": ["Watches, Pens & Lighters", "Watches", "Rolex Watches"],
    "currentBid": 4350,
    "startingBid": 4550,
    "currency": "EUR",
    "reservePriceSet": true,
    "reservePriceMet": false,
    "auctionStatus": "open_now",
    "closingTime": "2026-08-30T13:00:00Z",
    "sellerName": "SwissOnly",
    "sellerCountry": "Lithuania",
    "sellerIsPro": true,
    "specs": {
        "Brand": "Rolex",
        "Movement": "Automatic",
        "Case material": "Steel",
        "Condition": "Very good - minor signs of wear",
        "Year": "2018"
    },
    "scrapedAt": "2026-08-28T09:12:48.525Z"
}
```

### How to scrape Catawiki data

1. Pick a starting point: a free-text keyword (`searchQuery`, e.g. `"rolex"` or `"monet"`) or a category URL (`categoryUrl`, e.g. `https://www.catawiki.com/en/c/333-watches`).
2. Set `maxResults` for how many lots you want back.
3. Leave `fetchBidDetails` on (default) to get the current bid, closing time, reserve status, and seller details on every lot. Turn it off if you only need titles, images and URLs and want the fastest possible run.
4. Run the actor. Results land in the default dataset, one row per lot, ready to export as JSON, CSV, or Excel, or pull via the Apify API.
5. For monitoring, re-run on a schedule against the same search or category and diff on `lotId` to see which lots moved, closed, or sold since the last run.

Catawiki lists thousands of new lots a day across watches, art, jewellery, classic cars, wine, coins, and more. Category and search pages only expose 24 lots per page, so scraping a full vertical means walking pagination — the actor handles that, plus de-duplicating lots you've already seen in the same run.

### Cost estimate

This actor charges $0.01 per run start plus $0.005 per result. 100 results costs about $0.51; 1,000 about $5.01. A run's usage cost only settles after it reports SUCCEEDED.

Under the hood it uses roughly 2 Bright Data requests per lot with `fetchBidDetails` on (one shared listing-page request per 24 lots, plus one detail-page request per lot for the current bid and closing time). Detail-page enrichment is where the differentiating fields live, so most of the cost sits there.

### Limitations

- Prices, current bids, and closing times reflect the moment the lot is scraped — auctions move fast in the final hours, so re-run close to closing time if timing matters.
- Currency is read per page and is EUR on the `/en/` locale paths this actor uses.
- Data is scraped from the public website and may change without notice if Catawiki changes its page structure.
- Respect Catawiki's terms of service and use responsibly.

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping
every one of them working. Automated runs test this actor against the live
site and verify the output is complete. When the website changes, the
scraper usually gets repaired the same day, without you having to report
anything. Questions and issues go straight to the people who built it, and
most get an answer the same day.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API, maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.

# Actor input Schema

## `searchQuery` (type: `string`):

Free text keyword search (e.g. 'rolex', 'rolex watch', 'monet painting'). Used when categoryUrl is not set. Ignored if categoryUrl is provided.

## `categoryUrl` (type: `string`):

Full Catawiki category URL to browse instead of a keyword search, e.g. 'https://www.catawiki.com/en/c/333-watches' or 'https://www.catawiki.com/en/c/85-art'. Overrides Search Query when set.

## `maxResults` (type: `integer`):

Maximum number of lots to return. Each lot beyond the listing page costs one extra Bright Data request (for current bid + closing time), so keep this reasonable for a single run.

## `fetchBidDetails` (type: `boolean`):

When true (default), fetches each lot's detail page for current bid, closing time, reserve status and seller info — this is the actor's core value versus a plain listing scrape, and roughly doubles the number of requests (one extra request per lot). Turn off only for a fast, cheap title/image/URL-only listing pull.

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data API key for the Web Unlocker zone. Leave empty to use the built-in unlocking service.

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

Legacy field, kept for backwards compatibility. Fetching now goes through the built-in Bright Data Web Unlocker (Catawiki is Akamai-protected — see docs/site-recon/catawiki.md), so this is ignored.

## Actor input object example

```json
{
  "searchQuery": "watches",
  "maxResults": 20,
  "fetchBidDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "watches",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "searchQuery": "watches",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/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 '{
  "searchQuery": "watches",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/catawiki-scraper --silent --output-dataset

```

## MCP server setup

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