# Ricardo.ch Scraper — Swiss Marketplace Listings & Auctions (`studio-amba/ricardo-ch-scraper`) Actor

Scrape ricardo.ch, Switzerland's largest online marketplace. Extract listings with prices, auction bids, condition, brand, seller location, and auction end dates from keyword searches or categories. Auctions and buy-now offers in one clean dataset. No login required.

- **URL**: https://apify.com/studio-amba/ricardo-ch-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 $2.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/platform/actors/running/actors-in-store#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

## Ricardo.ch Scraper — Swiss Marketplace Listings & Auctions

Extract listings, auctions, and prices from [ricardo.ch](https://www.ricardo.ch), Switzerland's largest online marketplace. Search by keyword or scrape entire categories, and get structured data with prices, current bids, condition, brand, seller location, and auction end dates. No login or cookies required.

### Why use this scraper?

Ricardo.ch is the biggest consumer marketplace in Switzerland (part of SMG Swiss Marketplace Group, alongside tutti.ch and homegate.ch). It hosts millions of active listings across auctions and fixed-price offers. This scraper turns those listings into clean JSON you can use for:

- **Price monitoring** — track what products actually sell for on the Swiss market
- **Auction sniping research** — find auctions ending soon with low bids
- **Resale arbitrage** — compare Ricardo prices against other European marketplaces
- **Market research** — analyze supply, condition, and pricing per brand or category
- **E-commerce intelligence** — see what private sellers and shops charge in CHF

### Features

- Keyword search across the entire marketplace
- Category scraping with automatic pagination (60 listings per page)
- Auction data: current bid, number of bids, auction end date
- Buy-now prices and "make an offer" flags
- Condition, brand, seller location, and listing dates
- Clean, flat JSON output — no HTML parsing needed on your side
- Handles Cloudflare protection via Bright Data Web Unlocker

### How to scrape Ricardo.ch data

1. Get a [Bright Data](https://brightdata.com) API key with a Web Unlocker zone named `web_unlocker1` (ricardo.ch sits behind a Cloudflare managed challenge, so a plain proxy is not enough)
2. Enter a **Search Query** (e.g. `velo`, `iphone`, `uhr`) or a **Category** slug (e.g. `velos-82249`)
3. Set **Max Results** to the number of listings you need
4. Paste your Bright Data API key into the **Bright Data API Key** field
5. Run the actor and download your data as JSON, CSV, or Excel

The scraper reads the server-rendered search results directly, so one request returns 60 fully-structured listings. A 1,000-listing category scrape needs only ~17 page fetches.

#### Search vs category mode

- **Search mode** (`searchQuery`): returns up to 60 listings per run — one results page. Ricardo.ch blocks paginated search URLs for automated access, so deeper keyword pulls are not possible.
- **Category mode** (`category`): paginates freely. Pass a category slug like `velos-82249` or a full URL like `https://www.ricardo.ch/de/c/velos-82249/`. Use this when you need hundreds or thousands of listings.

You can find category slugs by browsing ricardo.ch — the slug is the last path segment of any category page URL.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | Keyword to search for. Default: `velo`. Max 60 results per run. |
| `category` | string | Category slug (e.g. `velos-82249`) or full category URL. Overrides `searchQuery` and supports pagination. |
| `maxResults` | integer | Maximum listings to return. Default: 100. |
| `brightDataApiKey` | string (secret) | Your Bright Data Web Unlocker API key. Required. |
| `proxyConfiguration` | object | Kept for compatibility — not used (Bright Data handles anti-bot). |

#### Example input

```json
{
    "searchQuery": "velo",
    "maxResults": 20
}
```

### Output

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique ricardo.ch article ID |
| `title` | string | Listing title |
| `price` | number | Buy-now price, or current bid for auction-only listings (CHF) |
| `currency` | string | Always `CHF` |
| `priceType` | string | `auction`, `buynow`, or `negotiable` |
| `condition` | string | `new`, `like_new`, `acceptable`, or `damaged` |
| `brand` | string | Brand name when the seller provided one |
| `city` | string | Seller city (pickup/shipping location) |
| `canton` | string | Two-letter canton code when the city carries one |
| `sellerId` | string | Ricardo seller account ID |
| `imageUrl` | string | Primary listing image |
| `listingDate` | string | ISO 8601 creation date |
| `auctionEndDate` | string | ISO 8601 auction end date (auction listings) |
| `bidPrice` | number | Current highest bid (auction listings) |
| `bidsCount` | integer | Number of bids (auction listings) |
| `buyNowPrice` | number | Fixed price when the listing offers buy-now |
| `category` | string | Product type key, e.g. `bicycle` |
| `url` | string | Full listing URL |
| `scrapedAt` | string | ISO 8601 scrape timestamp |

#### Example output

```json
{
    "id": "1306648498",
    "title": "Vélo de Course Trek Madone SLR 6, taille S",
    "price": 3300,
    "currency": "CHF",
    "priceType": "buynow",
    "condition": "acceptable",
    "brand": "Trek",
    "city": "Genève",
    "sellerId": "406596178",
    "imageUrl": "https://img.ricardostatic.ch/images/6bc66be8-3b68-49c1-ad24-922053c90833/t_265x200/velo-de-course-trek-madone-slr-6-taille-s",
    "listingDate": "2025-12-21T16:42:00Z",
    "category": "bicycle",
    "buyNowPrice": 3300,
    "url": "https://www.ricardo.ch/de/a/velo-de-course-trek-madone-slr-6-taille-s-1306648498/",
    "scrapedAt": "2026-07-11T19:41:46.936Z"
}
```

### Cost estimate

One page fetch returns 60 listings, so runs are cheap: a 100-listing run needs 2 requests, a 1,000-listing category run about 17. Compute usage is minimal (no browser). Expect thousands of listings per dollar of platform credits, plus your Bright Data usage (roughly $0.0015 per page fetch — about $0.03 per 1,000 listings).

### Limitations

- Keyword search returns at most 60 listings per run (one page). Use category mode for larger pulls.
- Seller display names are not exposed on ricardo.ch search pages — you get the seller ID.
- The canton field is only filled when ricardo.ch includes it in the city name; the city itself is always present.
- Full listing descriptions require visiting each detail page and are not included (keeps runs fast and cheap).

### Related scrapers

- **[Tutti.ch Scraper](https://apify.com/studio-amba/tutti-ch-scraper)** — Swiss classifieds from tutti.ch, Ricardo's sibling marketplace (same SMG group).
- **[Homegate Scraper](https://apify.com/studio-amba/homegate-scraper)** — Swiss real estate listings from homegate.ch.
- **[Comparis Scraper](https://apify.com/studio-amba/comparis-scraper)** — Swiss insurance and telecom comparison data.
- **[Brack Scraper](https://apify.com/studio-amba/brack-scraper)** — Swiss electronics and IT products from brack.ch.
- **[AutoScout24 Scraper](https://apify.com/studio-amba/autoscout24-scraper)** — European used car listings.
- Browse the [Apify Store e-commerce category](https://apify.com/store/categories/ecommerce) for more marketplace scrapers from Studio AMBA.

### FAQ

**Do I need a ricardo.ch account?**
No. The scraper only reads public search and category pages. No login, no cookies.

**Why do I need a Bright Data key?**
Ricardo.ch is protected by a Cloudflare managed challenge that blocks datacenter IPs and headless browsers. Bright Data's Web Unlocker solves this server-side. A free trial account is enough to test.

**Is this legal?**
The scraper only collects publicly visible listing data, the same information any visitor sees. You are responsible for how you use the data — check local regulations for your use case.

**Can I get listing descriptions or seller names?**
Not in this version. Both live on individual detail pages; scraping them would multiply request costs per listing. Open an issue if you need this and we will consider a detail-page option.

# Actor input Schema

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

Keyword to search for (e.g. 'velo', 'iphone', 'uhr'). Search returns up to 60 listings (one results page). For deeper scrapes use Category instead.

## `category` (type: `string`):

Ricardo category slug for paginated category scraping, e.g. 'velos-82249' or a full category URL like https://www.ricardo.ch/de/c/velos-82249/. When set, the category is scraped instead of the search query and pagination is supported (60 listings per page).

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

Maximum number of listings to return. Note: keyword search is capped at 60 listings per run; category mode paginates beyond that.

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

Your Bright Data API key for the Web Unlocker zone. Required to bypass ricardo.ch's Cloudflare protection. Get one at https://brightdata.com

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

Kept for compatibility — requests are routed through Bright Data Web Unlocker, so Apify proxies are not used.

## Actor input object example

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

# 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": "velo",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/ricardo-ch-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "velo",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/ricardo-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/ricardo-ch-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PmOkvl7bp8TjAG6Qa/builds/JMv5o1ogZ131vT5WE/openapi.json
