# Ricardo.ch \[Only $1] Scraper (`memo23/apify-ricardo-ch-scraper`) Actor

Extract detailed product listings from Ricardo.ch including: pricing (auction/buy-now), product specs, seller info, high-res images, shipping options, payment methods, and condition. Get comprehensive data for price monitoring, market research, and inventory management with structured JSON output.

- **URL**: https://apify.com/memo23/apify-ricardo-ch-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Jobs, Lead generation
- **Stats:** 94 total users, 11 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 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.

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

## Ricardo.ch Scraper

**Unlock the Full Power of Ricardo.ch Marketplace Data** - The only scraper you need to track, analyze, and understand product listings on Ricardo.ch with enterprise-grade reliability and precision. Whether you're monitoring price trends, tracking specific product categories, or conducting market research, our scraper delivers comprehensive, real-time insights while saving you time and resources.

*"From electronics and fashion to collectibles and more, we turn Ricardo's marketplace data into your competitive advantage."*

### Overview

The Ricardo.ch Scraper is your go-to tool for extracting product data from Ricardo.ch. Ideal for e-commerce sellers, market analysts, and product researchers, it tracks item details, pricing, and listing information across Switzerland. With easy setup and multiple export formats (JSON, CSV), it's perfect for anyone looking to gather comprehensive marketplace data from Ricardo.ch.

### What does Ricardo.ch Scraper do?

The Ricardo.ch Scraper is a powerful tool that enables you to:

#### Comprehensive Data Collection

- **Product Data**
  - Extract complete product details and specifications
  - Scrape historical listing data and price changes
  - Gather comprehensive product features and descriptions
  - Analyze product categories and seller information
  - Download high-quality product images
- **Seller Data**
  - Scrape individual seller profiles with complete information
  - Extract seller performance metrics and ratings
  - Gather seller history and listing statistics
  - Access seller location and shipping information

#### Advanced Scraping Capabilities

- **Pagination Handling**: Automatically navigates through all search result pages
- **Efficient Processing**: Processes only new or updated listings in subsequent runs
- **Change Detection**: Identifies price changes, status updates, and new listings
- **Scheduled Monitoring**: Set up automated runs to keep your marketplace data current
- **Incremental Data Collection**: Build comprehensive product datasets over time

#### Flexible Scraping Options

- **Seller Profiles**: Scrape individual seller details using profile URLs
  - Example: `https://www.ricardo.ch/de/u/username/`
- **Category Pages**: Extract product listings by category
  - Example: `https://www.ricardo.ch/de/c/autos-69957/`
- **Search Results**: Extract all products matching specific search criteria
  - Example: `https://www.ricardo.ch/de/s/bike%20fully/`
- **Filtered Searches**: Apply advanced filters directly in the URL
  - Example: `https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description`
- **Individual Listings**: Target specific products using direct URLs
  - Example: `https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/`

This tool is ideal for:

- Swiss e-commerce market research and analysis
- Product pricing analysis and competitive intelligence
- Market trend analysis across various categories
- Building product databases for business intelligence
- Tracking price trends and seller performance in the Swiss market

### Features

- **Comprehensive Data Extraction**: Detailed product information, pricing, and specifications
- **Dual Scraping Modes**:
  - **Search Results**: Scrape all properties from search results (e.g., `https://www.ricardo.ch/de/s/bike%20fully/`)
  - **Individual Listings**: Target specific properties using direct URLs (e.g., `https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/`)
- **Flexible Input**: Supports multiple input formats:
  - Search result URLs (e.g., `https://www.ricardo.ch/de/s/bike%20fully/`)
  - Direct property URLs (e.g., `https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/`)
  - Custom search criteria with advanced filters
- **Automatic Pagination**: Handles multi-page results automatically across all search types
- **Efficient Processing**: Concurrent scraping with configurable concurrency settings
- **Reliable Performance**: Built-in retry mechanisms and proxy support
- **Structured Data Export**: Download property data in JSON or CSV format for analysis

### How to Use

#### Scraping Property Listings

To scrape property listings:

1. **Set Up**: Ensure you have an Apify account and access to the Apify platform.
2. **Configure Input**: Provide the search URL or specific property URL:
   - `https://www.ricardo.ch/de/s/bike%20fully/`
   - `https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/`
3. **Adjust Settings**: Configure options like max items, monitoring mode, and proxy settings as needed.
4. **Run the Scraper**: Execute the scraper on the Apify platform.
5. **Data Collection**: The scraper will output all available property data.

### Input Configuration

Here's an example of how to set up the input for the Ricardo.ch Scraper:

```json
{
    "startUrls": [
        {
            "url": "https://www.ricardo.ch/de/s/bike%20fully/"
        },
        {
            "url": "https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/"
        }
    ],
    "maxItems": 1000,
    "monitoringMode": false,
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
```

#### Input Fields Explanation

- `startUrls`: Array of objects containing one of these formats:
  - Search URL: `{"url": "https://www.ricardo.ch/de/s/bike%20fully/"}`
  - Property URL: `{"url": "https://www.ricardo.ch/de/a/cannondale-scalpel-hi-mod-ultimate-1292546868/"}`
- `maxItems`: Maximum number of items to scrape (default: 1000).
- `monitoringMode`: When enabled, only scrapes new listings compared to previous runs (default: false).
- `maxConcurrency`: Maximum number of pages processed simultaneously (default: 10).
- `minConcurrency`: Minimum number of pages processed simultaneously (default: 1).
- `maxRequestRetries`: Number of retries for failed requests (default: 100).
- `proxyConfiguration`: Proxy settings for enhanced scraping reliability.

### Monitoring Mode

When `monitoringMode` is enabled, the scraper will only collect new listings that haven't been seen in previous runs. This is useful for:

- Tracking new properties as they come on the market
- Building a historical archive of property listings
- Monitoring specific areas for new opportunities without duplicating data

#### How Monitoring Mode Works

1. The scraper maintains a record of previously scraped property IDs
2. On subsequent runs with `monitoringMode: true`, it checks each property against this record
3. Only new properties (those not in the record) are processed and added to the output
4. The record is updated with any new property IDs found

### Output Structure

The scraper provides comprehensive information about Ricardo.ch property listings. The output includes detailed property information, agent/agency details, location data, and multimedia content. Here's a breakdown of the main components:

#### Sample JSON Output

```json
{
    "id": "1285066004",
    "offer": {
        "availability_key": "in_stock",
        "city": "Winterthur",
        "end_date": "2025-07-06T19:00:00Z",
        "initial_quantity": 1,
        "offer_id": "1285066004",
        "offer_type": "fixed_price",
        "payment_method_keys": [],
        "price": 2540,
        "remaining_quantity": 1,
        "remaining_time": 298612,
        "start_date": "2025-06-26T19:00:00Z",
        "warranty_description": "2 Jahre",
        "zip_code": "8404",
        "price_offer": {
            "seller_allows_price_offers": false,
            "can_receive_price_offers": false,
            "minimum_price": null
        },
        "sellerConsentDate": "2025-03-28T19:50:34.763Z"
    },
    "description": {
        "locale": "fr",
        "html": "<strong>W8848 | M, 44cm, für 177-189cm</strong><br /><span style=\"font-size:30px\">Mountainbike Scott </span><span style=\"font-size:30px\">Spark 960</span><br />W8848 | M, 44cm, für 177-189cm<br /><br />Verfügbarkeit: Demovelo, nicht käuflich. Verfügbar im Laden<br /><br />Schaltung: 12-Gang Shimano XT<br />Bremse: Shimano MT501 Disc 180/180<br />Pneus: 62-622mm / 29&#34;<br />Grösse: M, 44cm, für 177-189cm<br />Gewicht: 15.0 kg<br />Antrieb: Kettenschaltung<br />Material: Aluminium<br />Federung: Federgabel 130mm / Federbein 120mm<br />Farbe: Rot<br />Jahrgang: 2022<br />Km-Stand: 0 km<br /><br /><strong>Preisgestaltung:</strong><br />Basispreis Fr. 3&#39;299.-<br />Abzüglich 30% Rabatt: -Fr. 990.-<br />Gesamtpreis: Fr. 2&#39;309.-<br /><br />Bemerkung: 30% Rabatt / Preis ohne Pedalen / Demovelo nicht zu verkaufen. Weitere Spark 960 gibt es bei Velo Zürich zu kaufen.<br /><br />Garantie: 2 Jahre<br /><br /><br /><br /><br />Für den Erhalt des gekauften Fahrzeuges gibt es folgende 2 Möglichkeiten:<br />1. Abholung im Laden mit Vorauszahlung oder Zahlung vor Ort.<br />2. Heimlieferung nach Vorauszahlung.<br /><br /><br /><br />[picture1]<br /><br /><br /><br /><br /><br /><br />Während folgenden Zeiten bedienen wir das Telefon, beantworten E-Mails und empfangen Interessenten, welche vorgängig einen Termin mit uns vereinbart haben: Di-Fr 9-12/13-18:30 Uhr, Sa 9-12/13-16 Uhr.<br /><br />"
    },
    "images": [
        {
            "url": "https://img.ricardostatic.ch/images/1e9352ba-6cac-49df-bcb5-4d3053a967e0/t_1000x750/scott-spark-960",
            "previewUrl": "https://img.ricardostatic.ch/images/1e9352ba-6cac-49df-bcb5-4d3053a967e0/t_100x75/scott-spark-960",
            "bigSizeUrl": "https://img.ricardostatic.ch/images/1e9352ba-6cac-49df-bcb5-4d3053a967e0/t_1800x1350/scott-spark-960",
            "maxSize": 32767
        },
        {
            "url": "https://img.ricardostatic.ch/images/c00c1409-8106-469f-b450-3f5841580848/t_1000x750/scott-spark-960",
            "previewUrl": "https://img.ricardostatic.ch/images/c00c1409-8106-469f-b450-3f5841580848/t_100x75/scott-spark-960",
            "bigSizeUrl": "https://img.ricardostatic.ch/images/c00c1409-8106-469f-b450-3f5841580848/t_1800x1350/scott-spark-960",
            "maxSize": 32767
        },
        {
            "url": "https://img.ricardostatic.ch/images/c45e34ee-5421-4fda-83b3-d6fa899efe5c/t_1000x750/scott-spark-960",
            "previewUrl": "https://img.ricardostatic.ch/images/c45e34ee-5421-4fda-83b3-d6fa899efe5c/t_100x75/scott-spark-960",
            "bigSizeUrl": "https://img.ricardostatic.ch/images/c45e34ee-5421-4fda-83b3-d6fa899efe5c/t_1800x1350/scott-spark-960",
            "maxSize": 32767
        }
    ],
    "status": 0,
    "isLegacyArticle": true,
    "shippingInfo": [
        {
            "label": "see_description",
            "cost": 0,
            "description": "Abholung durch Käufer oder Versand per Spediteur: CHF 140.00",
            "methodId": "0",
            "isCumulative": false
        }
    ],
    "attributes": [],
    "category_id": 75716,
    "condition_key": "like_new",
    "is_archived": false,
    "is_planned": false,
    "legacy_status": 0,
    "title": "Scott Spark 960",
    "user_id": 406305829,
    "productType": {
        "key": "bicycle",
        "insert_id": null,
        "product_type_source": "AUTOMATIC_EXTRACTED",
        "product_type_selection_source": "DI_CLASSIFIER",
        "platform": "WEB",
        "validated": false,
        "status": "PUBLISHED",
        "name": "Velo",
        "additional_names": [
            "Fahrrad",
            "Fahrräder",
            "velos",
            "fahrad",
            "farrad",
            "bikes",
            "bike",
            "fahhrad"
        ],
        "attributes": [
            {
                "id": 10001,
                "values": [
                    {
                        "value": 10001007,
                        "type": "ENUM",
                        "name": "Schwarz",
                        "is_other_value": false,
                        "status": "PUBLISHED",
                        "group": "color"
                    }
                ],
                "validated": false,
                "status": "PUBLISHED",
                "key": "color",
                "localized_values": true,
                "name": "Farbe"
            },
            {
                "id": 10002,
                "values": [
                    {
                        "value": 10002006,
                        "type": "ENUM",
                        "name": "Unisex",
                        "is_other_value": false,
                        "status": "PUBLISHED",
                        "group": "gender"
                    }
                ],
                "validated": false,
                "status": "PUBLISHED",
                "key": "gender",
                "localized_values": true,
                "name": "Geschlecht und Altersgruppe"
            },
            ...
        ]
    },
    "seller": {
        "account_type": "professional",
        "addresses": [
            {
                "city": "Winterthur",
                "zip_code": "8404"
            }
        ],
        "articleCount": 97,
        "avatarSrc": "https://img.ricardostatic.ch/images/5136fecf-512c-43e3-af65-c1df3d8de159/t_225",
        "country": "CH",
        "id": "406305829",
        "identification": {
            "idDocument": {
                "status": "not_verified"
            },
            "phoneNumber": {
                "status": "not_verified"
            },
            "postalAddress": {
                "status": "verified",
                "verified_at": "2019-07-18T00:00:00Z"
            }
        },
        "isPro": true,
        "nickname": "Velo_Winterthur",
        "openOffers": [
            {
                "id": "1292411352",
                "title": "Riese & Müller Charger4 GT vario CORE",
                "hasBuyNow": true,
                "hasAuction": false,
                "endDate": "2025-07-09T12:54:00Z",
                "image": "https://img.ricardostatic.ch/images/dfaef657-9959-4b41-8a24-3694b25af4d6/t_265x200/riese-mueller-charger4-gt-vario-core",
                "buyNowPrice": 4349,
                "bidPrice": null,
                "bidsCount": 0,
                "categoryId": 80804,
                "isPromo": false,
                "conditionKey": "like_new",
                "isMoneyGuard": false,
                "startDate": "2025-06-29T12:54:00Z",
                "creationDate": "2025-06-29T12:54:00Z",
                "sellerId": "406305829",
                "shipping": [
                    {
                        "key": "see_description",
                        "cost": 0,
                        "zipCode": "8404",
                        "city": "Winterthur"
                    }
                ],
                "brand": "Riese & Müller",
                "size": "49cm",
                "productTypeKey": "bicycle",
                "canMakeAnOffer": false
            },
            ...
        ],
        "ratingsCount": 121,
        "score": 0.9915
    },
    "showBankTransfer": true,
    "categories": [
        {
            "id": 41875,
            "url": "https://www.ricardo.ch/de/c/sports-41875/",
            "name": "Sport",
            "slug": "sports-41875",
            "isIgnoredForNavigation": false
        },
        {
            "id": 41950,
            "url": "https://www.ricardo.ch/de/c/velo-fahrrad-41950/",
            "name": "Radsport",
            "slug": "velo-fahrrad-41950",
            "isIgnoredForNavigation": false
        },
        {
            "id": 82249,
            "url": "https://www.ricardo.ch/de/c/velos-82249/",
            "name": "Velos",
            "slug": "velos-82249",
            "isIgnoredForNavigation": false
        }
    ],
    "canTranslate": true,
    "deliveriesAndAssociatedPaymentMethods": [
        {
            "deliveryMethod": {
                "label": "see_description",
                "cost": 0,
                "description": "Abholung durch Käufer oder Versand per Spediteur: CHF 140.00",
                "methodId": "0",
                "isCumulative": false
            },
            "paymentMethods": [
                {
                    "method": "bank_transfer",
                    "type": "not_secured"
                }
            ],
            "hasSecuredPaymentMethod": false
        }
    ],
    "isAuctionMGEligible": false,
    "isPriceOfferMGEligible": false,
    "isBuyNowMGEligible": false,
    "moneyGuardMaxPrice": 500000,
    "freeShippingCampaign": {
        "campaignId": "",
        "isEligible": false
    },
    "seoMeta": {
        "title": "Scott Spark 960 | Kaufen auf Ricardo",
        "metaRobots": "index, follow, max-image-preview:large",
        "alternateUrls": [
            {
                "locale": "de",
                "alternateUrl": "https://www.ricardo.ch/de/a/scott-spark-960-1285066004/"
            },
            {
                "locale": "fr",
                "alternateUrl": "https://www.ricardo.ch/fr/a/scott-spark-960-1285066004/"
            },
            {
                "locale": "it",
                "alternateUrl": "https://www.ricardo.ch/it/a/scott-spark-960-1285066004/"
            }
        ],
        "metaDescription": "Preis: CHF 2540 | Zustand: Neu (gemäss Beschreibung) | Scott Spark 960 in Winterthur online kaufen auf Ricardo | W8848 | M, 44cm, für 177-189cm Mountainbike Scott Spark 960 W8848 | M, 44cm, für 177-1…"
    },
    "feedbackState": "hidden",
    "errorCode": null,
    "basicInfo": {
        "id": "1285066004",
        "title": "Scott Spark 960",
        "hasBuyNow": true,
        "hasAuction": false,
        "endDate": "2025-07-06T19:00:00Z",
        "image": "https://img.ricardostatic.ch/images/1e9352ba-6cac-49df-bcb5-4d3053a967e0/t_265x200/scott-spark-960",
        "buyNowPrice": 2540,
        "bidPrice": null,
        "bidsCount": 0,
        "categoryId": 75716,
        "isPromo": false,
        "conditionKey": "like_new",
        "isMoneyGuard": false,
        "startDate": "2025-06-26T19:00:00Z",
        "creationDate": "2025-03-28T19:51:00Z",
        "sellerId": "406305829",
        "shipping": [
            {
                "key": "see_description",
                "cost": 0,
                "zipCode": "8404",
                "city": "Winterthur"
            }
        ],
        "brand": "Scott",
        "productTypeKey": "bicycle",
        "canMakeAnOffer": false
    }
}
```

### Output Fields Explanation

#### Basic Information

- `id` (String): Unique identifier for the listing (e.g., "1285066004")

#### Offer Details

- `offer` (Object): Contains pricing and availability information
  - `availability_key` (String): Stock status (e.g., "in_stock")
  - `city` (String): Location city (e.g., "Winterthur")
  - `end_date` (ISO 8601): Listing end date/time in UTC (e.g., "2025-07-06T19:00:00Z")
  - `initial_quantity` (Number): Original quantity available (e.g., 1)
  - `offer_id` (String): Unique offer identifier (matches listing ID)
  - `offer_type` (String): Type of offer (e.g., "fixed_price" for fixed price listings)
  - `payment_method_keys` (Array): List of accepted payment method identifiers (empty array if none specified)
  - `price` (Number): Current price in Swiss Francs (e.g., 2540 = CHF 2,540.00)
  - `remaining_quantity` (Number): Items still available for purchase
  - `remaining_time` (Number): Seconds remaining until listing ends (e.g., 298612 seconds)
  - `start_date` (ISO 8601): Listing start date/time in UTC
  - `warranty_description` (String): Warranty information in seller's language (e.g., "2 Jahre" = 2 years)
  - `zip_code` (String): Location postal code (e.g., "8404" for Winterthur)
  - `price_offer` (Object): Price negotiation details
    - `seller_allows_price_offers` (Boolean): If seller allows price negotiations
    - `can_receive_price_offers` (Boolean): If the listing can receive price offers
    - `minimum_price` (Number|null): Minimum acceptable price if applicable (null if not set)
  - `sellerConsentDate` (ISO 8601): When seller consented to the offer terms in UTC (e.g., "2025-03-28T19:50:34.763Z")

#### Description

- `description` (Object): Localized listing description
  - `locale` (String): IETF language tag (e.g., "fr" for French)
  - `html` (String): Rich text description with HTML markup including styling, line breaks, and special characters

#### Media

- `images` (Array\[Object]): Product images with various sizes
  - `url` (String): Medium-sized image URL (e.g., ".../t_1000x750/...")
  - `previewUrl` (String): Small thumbnail URL (e.g., ".../t_100x75/...")
  - `bigSizeUrl` (String): Large preview URL (e.g., ".../t_1800x1350/...")
  - `maxSize` (Number): Maximum image dimension in pixels (e.g., 32767)

#### Listing Status

- `status` (Number): Listing status code (0 = active, other values indicate different states)
- `isLegacyArticle` (Boolean): If listing uses the older legacy format (true) or newer format (false)
- `is_archived` (Boolean): If the listing has been archived by the seller (false = active)
- `is_planned` (Boolean): If the listing is scheduled to be published in the future (false = currently active)
- `legacy_status` (Number): Numeric status code from the legacy system (0 typically means active/normal)

#### Seller Information

- `seller` (Object): Detailed information about the seller
  - `account_type` (String): Type of account ("professional" or "private")
  - `addresses` (Array\[Object]): Seller's location information
    - `city` (String): Seller's city (e.g., "Winterthur")
    - `zip_code` (String): Postal code (e.g., "8404")
  - `articleCount` (Number): Total number of active listings by this seller (e.g., 97)
  - `avatarSrc` (String): URL to the seller's profile image (e.g., ".../t_225")
  - `country` (String): ISO country code (e.g., "CH" for Switzerland)
  - `id` (String): Seller's unique identifier (e.g., "406305829")
  - `identification` (Object): Verification status of seller's identity
    - `idDocument` (Object): ID verification status
      - `status` (String): Verification state (e.g., "not_verified")
    - `phoneNumber` (Object): Phone verification status
      - `status` (String): Verification state (e.g., "not_verified")
    - `postalAddress` (Object): Address verification status
      - `status` (String): Verification state (e.g., "verified")
      - `verified_at` (ISO 8601): When verification was completed (e.g., "2019-07-18T00:00:00Z")
  - `isPro` (Boolean): If the seller has a professional account (true) or is a private seller (false)
  - `nickname` (String): Seller's display name/username (e.g., "Velo_Winterthur")
  - `openOffers` (Array\[Object]): List of seller's other active listings
    - `id` (String): Unique listing identifier
    - `title` (String): Listing title
    - `hasBuyNow` (Boolean): If "Buy Now" is available
    - `hasAuction` (Boolean): If auction bidding is available
    - `endDate` (ISO 8601): Listing end date/time
    - `image` (String): URL to listing's main image
    - `buyNowPrice` (Number): Fixed price for immediate purchase
    - `bidPrice` (Number|null): Current highest bid (if auction)
    - `bidsCount` (Number): Number of bids placed
    - `categoryId` (Number): Internal category identifier
    - `isPromo` (Boolean): If the listing is a promotion
    - `conditionKey` (String): Item condition (e.g., "like_new")
    - `isMoneyGuard` (Boolean): If purchase protection is enabled
    - `startDate` (ISO 8601): When the listing was published
    - `creationDate` (ISO 8601): When the listing was created
    - `sellerId` (String): Seller's unique identifier
    - `shipping` (Array\[Object]): Shipping options
      - `key` (String): Shipping method identifier
      - `cost` (Number): Shipping cost in CHF
      - `zipCode` (String): Shipping origin postal code
      - `city` (String): Shipping origin city
    - `brand` (String): Product brand name
    - `size` (String): Product size/variant
    - `productTypeKey` (String): Type of product (e.g., "bicycle")
    - `canMakeAnOffer` (Boolean): If price negotiation is allowed
  - `ratingsCount` (Number): Total number of ratings received (e.g., 121)
  - `score` (Number): Seller's average rating score (0.0-1.0, e.g., 0.9915 for 99.15% positive)

#### Product Information

- `title` (String): Listing title (e.g., "Scott Spark 960")
- `productType` (Object): Categorized product information
  - `key` (String): Product type identifier (e.g., "bicycle")
  - `insert_id` (Number|null): Internal identifier (null if not applicable)
  - `product_type_source` (String): Source of product type detection (e.g., "AUTOMATIC_EXTRACTED")
  - `product_type_selection_source` (String): Method used to determine product type (e.g., "DI_CLASSIFIER")
  - `platform` (String): Platform where the product was listed (e.g., "WEB")
  - `validated` (Boolean): Whether the product type has been validated
  - `status` (String): Publication status (e.g., "PUBLISHED")
  - `name` (String): Primary product type name in local language (e.g., "Velo")
  - `additional_names` (Array\[String]): Alternative names in different languages (e.g., \["Fahrrad", "bike", "bicycle"])
  - `attributes` (Array\[Object]): Detailed product characteristics and specifications
    - `id` (Number): Unique attribute identifier (e.g., 10001 for color)
    - `key` (String): Attribute key (e.g., "color", "gender")
    - `name` (String): Display name of the attribute (e.g., "Farbe", "Geschlecht und Altersgruppe")
    - `validated` (Boolean): Whether the attribute has been validated
    - `status` (String): Publication status (e.g., "PUBLISHED")
    - `localized_values` (Boolean): Whether values are localized/translated
    - `values` (Array\[Object]): Possible values for the attribute
      - `value` (Number): Internal value identifier (e.g., 10001007)
      - `type` (String): Value type (e.g., "ENUM" for enumerated values)
      - `name` (String): Display name of the value (e.g., "Schwarz", "Unisex")
      - `is_other_value` (Boolean): If this is a custom/other value
      - `status` (String): Publication status of the value
      - `group` (String): Attribute group this value belongs to (e.g., "color", "gender")

#### Categories & Navigation

- `showBankTransfer` (Boolean): If bank transfer is shown as a payment option (e.g., true)
- `categories` (Array\[Object]): Hierarchical product categories
  - `id` (Number): Unique category identifier (e.g., 41875)
  - `url` (String): Full URL to category page (e.g., "https://www.ricardo.ch/de/c/sports-41875/")
  - `name` (String): Localized category name (e.g., "Sport", "Radsport")
  - `slug` (String): URL-friendly category identifier (e.g., "sports-41875")
  - `isIgnoredForNavigation` (Boolean): If the category should be hidden in navigation menus (false = visible)
- `canTranslate` (Boolean): If the listing content can be translated (e.g., true)

#### Shipping, Delivery & Payments

- `deliveriesAndAssociatedPaymentMethods` (Array\[Object]): Combined shipping and payment options
  - `deliveryMethod` (Object): Shipping/delivery details
    - `label` (String): Shipping method identifier (e.g., "see_description")
    - `cost` (Number): Shipping cost in CHF (0 = see description)
    - `description` (String): Detailed shipping information (e.g., "Abholung durch Käufer oder Versand per Spediteur: CHF 140.00")
    - `methodId` (String): Internal shipping method identifier (e.g., "0")
    - `isCumulative` (Boolean): If shipping cost increases with multiple items (false = flat rate)
  - `paymentMethods` (Array\[Object]): Available payment options for this shipping method
    - `method` (String): Payment method identifier (e.g., "bank_transfer")
    - `type` (String): Payment security type (e.g., "not_secured")
  - `hasSecuredPaymentMethod` (Boolean): If at least one secure payment method is available
- MoneyGram Eligibility:
  - `isAuctionMGEligible` (Boolean): If MoneyGram is available for auction purchases (e.g., false)
  - `isPriceOfferMGEligible` (Boolean): If MoneyGram is available for price offers (e.g., false)
  - `isBuyNowMGEligible` (Boolean): If MoneyGram is available for buy-now purchases (e.g., false)
  - `moneyGuardMaxPrice` (Number): Maximum price in cents for MoneyGuard protection (e.g., 500000 = CHF 5,000.00)
- `freeShippingCampaign` (Object): Information about free shipping promotions
  - `campaignId` (String): Identifier for the shipping campaign (empty string if none)
  - `isEligible` (Boolean): If the item qualifies for free shipping (e.g., false)
- `shippingInfo` (Array\[Object]): Available shipping/delivery options (legacy format)
  - `label` (String): Shipping method identifier (e.g., "see_description")
  - `cost` (Number): Shipping cost in CHF (0 = cost specified in description)
  - `description` (String): Detailed shipping information in seller's language
  - `methodId` (String): Internal shipping method identifier (e.g., "0")
  - `isCumulative` (Boolean): If shipping cost increases with multiple items (false = flat rate)
- `attributes` (Array): Additional product attributes/specifications (empty array if none provided)
- `category_id` (Number): Internal Ricardo.ch category identifier (e.g., 75716)
- `condition_key` (String): Item condition (e.g., "like_new" = in like-new condition)
- `title` (String): Listing title as shown on Ricardo.ch (e.g., "Scott Spark 960")
- `user_id` (Number): Internal Ricardo.ch identifier for the seller (e.g., 406305829)

#### SEO & Metadata

- `seoMeta` (Object): Search engine optimization data
  - `title` (String): Page title for search results (e.g., "Scott Spark 960 | Kaufen auf Ricardo")
  - `metaRobots` (String): Robots meta tag directives (e.g., "index, follow, max-image-preview:large")
  - `alternateUrls` (Array\[Object]): Language-specific URLs for hreflang tags
    - `locale` (String): Language/locale code (e.g., "de", "fr", "it")
    - `alternateUrl` (String): Full URL for this language version
  - `metaDescription` (String): Search result description snippet (e.g., "Preis: CHF 2540 | Zustand: Neu...")
- `feedbackState` (String): Visibility state of feedback UI (e.g., "hidden" = not shown)
- `errorCode` (null|String): Error code if there's an issue with the listing (null = no error)

#### Basic Info Summary

- `basicInfo` (Object): Summary of key listing details
  - `id` (String): Unique listing identifier (e.g., "1285066004")
  - `title` (String): Product title as shown on Ricardo.ch (e.g., "Scott Spark 960")
  - `hasBuyNow` (Boolean): If "Buy Now" option is available (e.g., true)
  - `hasAuction` (Boolean): If auction-style bidding is available (e.g., false)
  - `endDate` (ISO 8601): When the listing ends (e.g., "2025-07-06T19:00:00Z")
  - `image` (String): URL to the main product image (e.g., ".../t_265x200/...")
  - `buyNowPrice` (Number): Fixed price in CHF for immediate purchase (e.g., 2540 = CHF 2,540.00)
  - `bidPrice` (Number|null): Current highest bid amount (null if no bids)
  - `bidsCount` (Number): Total number of bids placed (e.g., 0)
  - `categoryId` (Number): Internal Ricardo.ch category identifier (e.g., 75716)
  - `isPromo` (Boolean): If the listing is part of a promotion (e.g., false)
  - `conditionKey` (String): Item condition (e.g., "like_new" = like new condition)
  - `isMoneyGuard` (Boolean): If purchase protection is enabled (e.g., false)
  - `startDate` (ISO 8601): When the listing was published (e.g., "2025-06-26T19:00:00Z")
  - `creationDate` (ISO 8601): When the listing was created (e.g., "2025-03-28T19:51:00Z")
  - `sellerId` (String): Unique identifier of the seller (e.g., "406305829")
  - `shipping` (Array\[Object]): Shipping options summary
    - `key` (String): Shipping method identifier (e.g., "see_description")
    - `cost` (Number): Shipping cost in CHF (0 = see description)
    - `zipCode` (String): Shipping origin postal code (e.g., "8404")
    - `city` (String): Shipping origin city (e.g., "Winterthur")
  - `brand` (String): Product brand name (e.g., "Scott")
  - `productTypeKey` (String): Type of product (e.g., "bicycle")
  - `canMakeAnOffer` (Boolean): If price negotiation is allowed (e.g., false)

***

### Explore More Scrapers

If you found this actor useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/7Fw4OYjfMapM6l49D/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
- Email: muhamed.didovic@gmail.com

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/apify-ricardo-ch-scraper`).

**Purpose:** Extract Ricardo.ch marketplace listings — offer/price, images, seller, categories, and product attributes — from search, category, seller-profile, or individual listing URLs.

**Minimal input:**

```json
{
  "startUrls": ["https://www.ricardo.ch/de/s/bike%20fully/"],
  "maxItems": 20,
  "monitoringMode": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": { "useApifyProxy": true }
}
```

**Output:** One row per listing — `id`, `title`, `offer` {price, city, zip_code, offer_type, start_date, end_date, availability_key}, `description` {locale, html}, `images[]` {url, previewUrl, bigSizeUrl}, `condition_key`, `category_id`, `categories[]` {id, name, url, slug}, `productType` {key, name}, `user_id`, `seller` {id, nickname, account_type, articleCount, ratingsCount, score, country, isPro}, `shippingInfo[]`, `basicInfo` {buyNowPrice, brand, conditionKey, hasBuyNow, hasAuction}, `seoMeta`.

**Behaviors an agent should know:**

- All start types (search, category, seller-profile, individual listing URL) resolve to listing rows; `startUrls` are plain URL strings.
- `maxItems` default is 1000 — always cap it; search and category URLs paginate automatically and can return thousands of rows.
- `monitoringMode` (default false): when true, only listings not seen in previous runs are output; the actor keeps a record of scraped listing IDs across runs.
- Bypasses Ricardo's Cloudflare wall via a built-in unblocker, so `proxy` is optional.
- Public listing pages only; no login-gated fields.
- Pay-per-event billing — see the Pricing tab on the actor page.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Ricardo AG (part of SMG Swiss Marketplace Group) or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Ricardo.ch marketplace listing pages — no authenticated endpoints, paid features, or content behind the ricardo.ch login wall. Users are responsible for ensuring their use complies with ricardo.ch's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

Ricardo scraper, scrape Ricardo, Ricardo.ch scraper, Ricardo API, Apify Ricardo, Ricardo.ch marketplace scraper, swiss marketplace scraper, product listing scraper, auction data scraper, ecommerce price monitoring, seller profile scraper, competitor price tracking, Switzerland classifieds data, secondhand marketplace intelligence, product research data, price trend analysis

# Actor input Schema

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

URLs to start with. The actor currently supports URLs such as `https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description`.

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

Maximum number of items that will be scraped.

## `monitoringMode` (type: `boolean`):

If checked, it will only scrape newly listings compared to what has been scraped in previous runs.

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

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

This actor bypasses ricardo.ch's Cloudflare wall via its own paid unblocker, so proxy settings here are optional and not required.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description"
  ],
  "maxItems": 1000,
  "monitoringMode": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/apify-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 = {
    "startUrls": ["https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description"],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/apify-ricardo-ch-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 '{
  "startUrls": [
    "https://www.ricardo.ch/de/s/bike%20fully/?attribute_groups.brand=1968&item_condition=new_see_description"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/apify-ricardo-ch-scraper --silent --output-dataset

```

## MCP server setup

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