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

\[💰 $2.50 / 1K] Extract Catawiki auction lots — titles, current bids and currencies, bidding start/end times, reserve and buy-now status, seller, and images. Search by keyword and category or paste Catawiki search URLs. Built for collectors, dealers, and auction market research.

- **URL**: https://apify.com/solidcode/catawiki-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Features:** Limited permissions
- **Stats:** 51 total users, 11 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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

Pull live auction lots from Catawiki at scale — titles, multi-currency bids, bidding windows, reserve and buy-now status, verified seller details, full-resolution image galleries, and category data for art, watches, jewelry, classic cars, wine, coins, and every other Catawiki specialty. Built for collectors, resellers, and auction-market researchers who need structured Catawiki lot data without clicking through endless result pages by hand.

### Why This Scraper?

- **Multi-currency live bids in one row** — every lot's `currentBid` is returned simultaneously in EUR, USD, and GBP, so you can compare across markets without converting anything yourself.
- **35 structured fields per lot** — including verified seller details (shop name, username, country) and the full-resolution image gallery, not just a single thumbnail.
- **Live auction state on every lot** — bidding start and end timestamps, reserve-price-met flag, buy-now availability, close status (open/closed), and live favourite count.
- **6 interface languages** — English, Dutch, German, French, Spanish, and Italian, controlling both the lot text returned and the locale context.
- **3 sort modes for time-sensitive monitoring** — Best Match, Ending Soonest, and Newest, so you can catch lots in the final hours or track freshly listed objects.
- **6 site filters carried straight through** — sub-category, seller country, no-reserve-only, object type, closing date and sort all come across exactly as Catawiki renders them when you paste a filtered link.
- **Whole-category sweeps at around 3,500 lots an hour** — set Max Results to 0 and it pages through an entire search or category, showing a live count and a finish estimate the whole way. Even Catawiki's five-figure pools, like the 21,000-lot no-reserve vintage set, come back in a single run.
- **Covers every Catawiki category** — art, watches, jewelry, classic cars, wine & whisky, coins & stamps, comics, antiques, and more, all through the same input.

### Use Cases

**Auction Market Research**

- Track closing prices and bid activity across watch, art, and jewelry categories
- Compare current bids in EUR, USD, and GBP to spot cross-market arbitrage
- Monitor how reserve prices and buy-now options affect bidding behaviour
- Build datasets of lots by category for trend and demand analysis

**Reseller & Dealer Sourcing**

- Find undervalued lots ending soon with no reserve met
- Surface buy-now-available lots for instant acquisition
- Filter sourcing to a specific category by pasting its Catawiki URL
- Compare seller shops and countries to identify reliable suppliers

**Price & Auction Monitoring**

- Watch lots in their final hours with the Ending Soonest sort
- Alert on new lots in a niche by re-running a keyword search on a schedule
- Track favourite counts as an early signal of bidding interest
- Capture point-in-time snapshots of current bids for valuation models

**Collection Valuation**

- Pull comparable sold and active lots to value a private collection
- Aggregate current bids across similar objects to estimate fair market value
- Match lots by category and seller country for like-for-like comparisons

**Lead Generation**

- Build lists of active seller shops by category and country
- Identify high-volume sellers worth approaching for partnerships
- Capture seller usernames and shop URLs for outreach

### Getting Started

#### Simple Keyword Search

Just type what you're looking for:

```json
{
    "searchQueries": ["rolex submariner"],
    "maxResults": 50
}
```

#### Multiple Keywords, Ending Soonest

Run several searches in one go and prioritise lots about to close:

```json
{
    "searchQueries": ["omega speedmaster", "tag heuer monaco"],
    "sortBy": "bidding_end_desc",
    "language": "en",
    "maxResults": 200
}
```

#### Paste a Filtered Catawiki URL

Narrow a search on Catawiki with the site's own filters, copy the address bar, and paste it in. The link below is the Rolex Watches sub-category limited to no-reserve lots:

```json
{
    "searchUrls": [
        "https://www.catawiki.com/en/s?q=rolex&filters=l2_categories%5B%5D%3D343%26reserve_price%5B%5D%3D0"
    ],
    "language": "en",
    "maxResults": 100
}
```

Two things to keep in mind when you copy a link: leave the keyword in it (a Catawiki search link without one returns nothing), and point it at a sub-category rather than a main department, because Catawiki lists sub-categories instead of lots on department pages.

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string\[] | `["rolex submariner"]` | Plain keywords to search Catawiki for, e.g. "art deco lamp". Each keyword runs its own search — no URL building needed. |
| `searchUrls` | string\[] | `[]` | Paste Catawiki search or sub-category URLs directly. Any filters already in the link — keyword, sub-category, seller country, no-reserve, object type, sort — are honoured as-is. Keep the keyword in a search link, and point it at a sub-category rather than a main department. |

#### Search Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | select | `Best Match` | Order in which keyword-search results are collected: Best Match, Ending Soonest, or Newest. Applies to keyword searches only — pasted URLs keep the sort encoded in the URL. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum lots to return across all keywords and URLs combined. You get exactly this many at most, never more, and you are never charged for more. Set to 0 for unlimited. Start with 20–50 to test, then increase. |
| `language` | select | `English` | Language and locale for the Catawiki site and the returned lot text: English, Dutch, German, French, Spanish, or Italian. |

### Output

Each lot is one flat row. Here's a representative result:

```json
{
    "id": 92345678,
    "title": "Rolex - Submariner Date - 16610",
    "subtitle": "Men - 2002-2003",
    "description": "Orologio subacqueo automatico in acciaio, con scatola e documenti...",
    "translatedDescription": "Stainless steel automatic dive watch with box and papers...",
    "url": "https://www.catawiki.com/en/l/92345678-rolex-submariner-date-16610",
    "auctionId": 4567890,
    "scrapedFromUrl": "rolex submariner",
    "currentBid": { "EUR": 6200, "USD": 6700, "GBP": 5300 },
    "currentBidValue": 6200,
    "currentBidCurrency": "EUR",
    "biddingStartTime": "2026-05-30T10:00:00Z",
    "biddingEndTime": "2026-06-06T19:18:58Z",
    "reservePriceSet": true,
    "reservePriceMet": false,
    "isBuyNowAvailable": false,
    "buyNow": null,
    "closeStatus": "open",
    "favoriteCount": 47,
    "sellerId": 1234567,
    "sellerShopName": "Vintage Time Pieces",
    "sellerUserName": "vintagetime",
    "sellerUrl": "https://www.catawiki.com/en/u/1234567-vintagetime",
    "sellerCountry": "Italy",
    "thumbImageUrl": "https://assets.catawiki.com/image/thumb/example.jpg",
    "originalImageUrl": "https://assets.catawiki.com/image/full/example.jpg",
    "images": [
        "https://assets.catawiki.com/image/full/example1.jpg",
        "https://assets.catawiki.com/image/full/example2.jpg"
    ],
    "categoryId": 343,
    "categoryName": "Rolex Watches",
    "categoryL0Name": "Watches, Pens & Lighters",
    "categoryL1Name": "Watches",
    "categoryUrl": "https://www.catawiki.com/en/c/343-rolex-watches",
    "hasFreeShipping": false,
    "isContentExplicit": false,
    "localized": true
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | number | Unique Catawiki lot identifier |
| `title` | string | Lot title |
| `subtitle` | string | Lot subtitle (often condition/era summary) |
| `description` | string | Full lot description text, in the language the seller wrote it |
| `translatedDescription` | string | Machine translation of the description into your chosen language. Filled only when the seller wrote the lot in a different language, so it is empty whenever the description is already in your language |
| `url` | string | Direct URL to the lot page |
| `auctionId` | number | Parent auction identifier |
| `scrapedFromUrl` | string | The keyword or URL this row originated from |

#### Pricing & Bidding

| Field | Type | Description |
|-------|------|-------------|
| `currentBid` | object | Current top bid in all three currencies: `{ EUR, USD, GBP }` |
| `currentBidValue` | number | Current top bid in the locale currency |
| `currentBidCurrency` | string | Currency code of `currentBidValue` |
| `biddingStartTime` | string | When bidding opens (ISO 8601) |
| `biddingEndTime` | string | When bidding closes (ISO 8601) |
| `reservePriceSet` | boolean | Whether the lot has a reserve price |
| `reservePriceMet` | boolean | Whether the reserve has been met |
| `isBuyNowAvailable` | boolean | Whether a buy-now option is available |
| `buyNow` | object | Buy-now details when present |
| `closeStatus` | string | Auction state: `open` or `closed` |
| `favoriteCount` | number | Live count of users who favourited the lot |

#### Seller

| Field | Type | Description |
|-------|------|-------------|
| `sellerId` | number | Seller identifier |
| `sellerShopName` | string | Seller shop / display name |
| `sellerUserName` | string | Seller username |
| `sellerUrl` | string | URL to the seller's Catawiki profile |
| `sellerCountry` | string | Country the seller ships from |

#### Images & Media

| Field | Type | Description |
|-------|------|-------------|
| `thumbImageUrl` | string | Thumbnail image URL |
| `originalImageUrl` | string | Primary full-size image URL |
| `images` | string\[] | All full-resolution image URLs for the lot |

#### Category & Flags

| Field | Type | Description |
|-------|------|-------------|
| `categoryId` | number | Catawiki category identifier |
| `categoryName` | string | Readable category name (e.g. "Rolex Watches") |
| `categoryL0Name` | string | Top-level department the lot sits in (e.g. "Watches, Pens & Lighters") |
| `categoryL1Name` | string | Category branch above the lot's own category (e.g. "Watches") |
| `categoryUrl` | string | URL to the lot's category page |
| `hasFreeShipping` | boolean | Whether the lot ships for free |
| `isContentExplicit` | boolean | Adult/explicit-content flag |
| `localized` | boolean | Whether the lot text is served in the requested language |

### Tips for Best Results

- **Start small** — set Max Results to 20–50 on your first run to confirm the data matches your needs, then scale up.
- **Paste a filtered Catawiki URL to scope precisely** — set the sub-category, seller-country, no-reserve or closing-date facets on the Catawiki website, copy the address bar into Search URLs, and you get that exact view. It is the sharpest way to cut a huge category down to the few hundred lots you actually want.
- **Use Ending Soonest for time-sensitive sourcing** — pair the Ending Soonest sort with a keyword to surface lots in their final hours, ideal for last-minute bidding decisions.
- **Read `currentBid` directly for cross-market comparison** — it already carries EUR, USD, and GBP side by side, so there's no need to convert `currentBidValue` yourself.
- **Combine keywords and URLs in one run** — mix plain keyword searches with pasted category URLs; results are merged and counted against a single Max Results cap.
- **Size a full sweep before you start one** — Max Results 0 collects everything a search or category holds, at roughly 3,500 lots an hour, and the live status tells you how many are in and how much longer the rest should take. Catawiki's biggest pools run well into five figures, so those are a multi-hour job: sweeping one filtered sub-category link at a time puts usable data in front of you far sooner than aiming one run at the whole category.
- **Group by `categoryL1Name`, not `categoryName`** — Catawiki mixes seasonal collections like "Inspire Me" and "Trending Now: Artists on the Rise" into the same category slot as permanent ones like "Rolex Watches". The branch above it is always a stable taxonomy name, so it gives you clean buckets for reporting.
- **Match the language to your audience** — switching Language re-runs the search in that locale, so titles and subtitles come back in the language your team or models expect. Descriptions stay in the seller's own words, with the translated version alongside them in `translatedDescription` whenever the two differ, so you get both the original and the readable copy.

### Pricing

**From $2.50 per 1,000 results** — among the most affordable Catawiki lot extractors on the market. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.30 | $0.28 | $0.265 | $0.25 |
| 1,000 | $3.00 | $2.80 | $2.65 | $2.50 |
| 10,000 | $30.00 | $28.00 | $26.50 | $25.00 |
| 100,000 | $300.00 | $280.00 | $265.00 | $250.00 |

A "result" is one auction lot row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. Platform fees depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate auction-market research, sourcing, valuation, and analysis. Users are responsible for complying with applicable laws and Catawiki's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data (such as seller details) in line with applicable privacy regulations.

# Actor input Schema

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

Type what you're looking for, e.g. 'rolex submariner' or 'art deco lamp'. Each keyword runs its own search — no need to build a URL. Leave empty if you only use Search URLs below.

## `searchUrls` (type: `array`):

Paste Catawiki search or sub-category URLs directly (e.g. https://www.catawiki.com/en/s?q=rolex). Any filters already in the link — keyword, sub-category, seller country, no-reserve, object type, sort — are honored as-is. Keep the keyword in a search link; a Catawiki search URL without one returns nothing. Main department pages list sub-categories rather than lots on Catawiki itself, so open a sub-category and paste that. The Sort setting below does NOT apply to pasted URLs.

## `sortBy` (type: `string`):

Order in which Search Keywords results are collected. Only applies to Search Keywords — ignored for pasted Search URLs (those keep the sort encoded in the URL).

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

Maximum number of lots to return across all keywords and URLs combined. You get exactly this many at most — never more, and you are never charged for more. Set to 0 for unlimited. Tip: start with 20-50 to test, then increase.

## `language` (type: `string`):

Language and locale for the Catawiki site and the returned lot text.

## Actor input object example

```json
{
  "searchQueries": [
    "rolex submariner"
  ],
  "searchUrls": [],
  "sortBy": "best_match_desc",
  "maxResults": 100,
  "language": "en"
}
```

# Actor output Schema

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

Table of scraped auction lots with title, current bid, bidding end time, and link.

# 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 submariner"
    ],
    "searchUrls": [],
    "sortBy": "best_match_desc",
    "maxResults": 100,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 submariner"],
    "searchUrls": [],
    "sortBy": "best_match_desc",
    "maxResults": 100,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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 submariner"
  ],
  "searchUrls": [],
  "sortBy": "best_match_desc",
  "maxResults": 100,
  "language": "en"
}' |
apify call solidcode/catawiki-scraper --silent --output-dataset

```

## MCP server setup

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