Ricardo.ch Listings Scraper
Pricing
Pay per event
Ricardo.ch Listings Scraper
Scrape live auction and classifieds listings from Ricardo.ch, Switzerland's #1 online marketplace — search by category or free-text slug and get title, price, listing URL, image, and a stable listing ID in one structured dataset, page after page.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
🎯 What this scrapes
Ricardo.ch is Switzerland's #1 auction and classifieds marketplace, and its search-results page (/de/s/<slug>) is the entry point for browsing any category or free-text query — laptops, bikes, watches, whatever buyers are searching for. This Actor drives that same search endpoint and returns every listing it finds as one clean row: title, price in CHF, listing URL, image, and a stable numeric listing ID, deduplicated across pages.
🔥 What we handle for you
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page, rotated browser impersonation on every retry. - 🧩 One search, two wire formats handled — Ricardo.ch ships page 1 and page 2+ differently under the hood; we normalize both into the same clean row shape.
- 🫠 A single unparsable page never fails the run — logged and pagination stops cleanly, the rest of your data still ships.
- 🧊 Clean, typed dataset rows — Pydantic-validated, deduplicated by listing ID, ISO-8601 timestamps, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for listings actually returned; a zero-match search costs nothing beyond the warm-up fee.
💡 Use cases
- Price monitoring — track how a category's listings and asking prices shift week to week.
- Resale sourcing — scan a category or keyword for underpriced listings worth flipping.
- Market research — build a dataset of live CHF pricing across Ricardo.ch categories.
- Feed a spreadsheet or BI tool with structured Swiss marketplace data, no manual copy-paste.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
search_slug | string | no | 'laptop' | The path segment after /de/s/ on Ricardo.ch — a category or free-text search term (e.g. laptop, velo). |
max_pages | integer | no | 2 | Hard cap on pages fetched. Keep at 2 or higher to exercise both of Ricardo.ch's listing formats. |
max_results | integer | no | 100 | Hard cap on dataset rows returned across all pages. |
proxyConfiguration | object | no | {'useApifyProxy': False} | Ricardo.ch's public search page is keyless with no anti-bot surface observed. Leave this off unless your account… |
Example input
{"search_slug": "laptop","max_pages": 2,"max_results": 20,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Numeric id trailing the listing URL (e.g. "1321416530"). |
title | string | Listing name/title. |
price | number | Asking/current price. Null when unparsable (e.g. "Preis auf Anfrage"). |
currency | string | Always "CHF" for Ricardo.ch. |
listing_url | string | Absolute URL to the listing detail page. |
image_url | string | Primary listing image, when present. |
search_slug | string | The input slug this row was found under. |
page | integer | 1-based page number this row was scraped from. |
source_format | string | Which parser produced this row: json_ld (page 1) or react_flight (page 2+). |
scraped_at | string | ISO-8601 timestamp of this fetch. |
Example output
{"listing_id": "1321416530","title": "POWERHOUSE MacBook Pro 16Zoll/M4 Pro/2 TB SSD/24 GB RAM","price": 2800.0,"currency": "CHF","listing_url": "https://www.ricardo.ch/de/a/powerhouse-macbook-pro-16zoll-m4-pro-2-tb-ssd-24-gb-ram-1321416530/","image_url": "https://ricardo-images.example/1321416530.jpg","search_slug": "laptop","page": 1,"source_format": "json_ld","scraped_at": "2026-09-20T00:00:00Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result-row | $0.004 | Per unique dataset item |
Example: 1 000 listings at the rates above ≈ $4.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Search-results fields only — no detail-page enrichment (seller info, bid history, full description) in this version.
- No auction end-time or bid-count fields — not published on the search-results page.
- German-language /de/s/ search path only; French/Italian locale paths are out of scope.
- Any endpoint requiring login (watchlist, bids, messaging) is out of scope.
❓ FAQ
Do I need a Ricardo.ch account or login?
No. This Actor reads only the public search-results page — no login, no auth header, no cookie session required.
What happens if my search slug has no listings?
The run succeeds with zero rows and a status message naming the slug searched — no placeholder rows, no failed run.
Which locale does this cover?
The German-language /de/s/ search path only. French (/fr/s/) and Italian (/it/s/) locales are not covered in this version.
Does this scrape the full listing detail page?
Not in this version — you get everything the search-results page publishes (title, price, URL, image, listing ID). Seller info, bid history, and full descriptions may land in a future version.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.