Tutti.ch Scraper Swiss Classifieds & Marketplace
Pricing
from $3.00 / 1,000 search result listings
Tutti.ch Scraper Swiss Classifieds & Marketplace
Scrape classified listings from tutti.ch. Extract prices, locations, cantons, seller info, GPS coordinates, images, and contact details. Browse by category (cars, real estate, electronics, furniture, jobs, and 20+ more). HTTP-only, fast, pay-per-result.
Pricing
from $3.00 / 1,000 search result listings
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
2
Bookmarked
62
Total users
14
Monthly active users
6.8 hours
Issues response
8 days ago
Last modified
Categories
Share
Tutti.ch Scraper
Scrape classified listings from tutti.ch, a Swiss online marketplace, into structured data: price in CHF, canton, seller type, GPS coordinates and images. Paste any tutti.ch search URL, no login or proxy setup needed.
How it works
- Go to tutti.ch and set up your search with all desired filters (category, search query, price range, fuel type, body type, location, etc.)
- Copy the URL from your browser
- Paste it into the Search URLs input
- Run the actor
That's it. The actor extracts all listings matching your search, with automatic pagination.
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client — Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/tutti-ch-scraper
Example prompt once connected:
"Use
tutti-ch-scraperto scrape company data from tutti ch. Return results as a table."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Features
- Any filter combination — Whatever you can filter on tutti.ch, the actor can scrape
- Multiple searches — Paste multiple URLs to run several searches in one run
- Detail enrichment — Optionally get GPS coordinates, all images, and seller ID
- Fast & cheap — HTTP-only, pay-per-result, built-in Swiss proxy handling (nothing to configure)
- Safe re-runs — rows are saved and billed as they are scraped; a restarted run never bills the same listing twice
What you get
| Field | Description | Source |
|---|---|---|
title | Listing title | Search |
price / price_chf | Price (formatted + numeric) | Search |
category | Category ID (e.g., "cars", "cellPhones") | Search |
category_label / category_path | Readable category and parent path ("Telefon & Navigation > Handys") | Detail |
listing_source | Where the ad comes from: tutti or a partner site such as autoscout24.ch | Search |
location / canton / postcode | Location details | Search |
seller_name / seller_type | Seller info (private/professional) | Search |
seller_plan / seller_logo_url | Professional plan (pro, plus) and logo | Search |
seller_member_since / seller_website | Account creation date, seller website (professional sellers). Not part of the search results, so they are null unless includeDetails is on | Detail |
image_url / image_count | Main thumbnail and number of images on the ad | Search |
latitude / longitude | GPS coordinates | Detail |
image_urls | All listing images | Detail |
seller_id | Seller account ID | Detail |
phone | Phone number (when available) | Detail + Regex |
email | Email address (regex extracted from description) | Regex |
description | Full listing text | Search |
id / currency | Tutti listing ID and currency code | Search |
posted_at | Posting timestamp | Search |
is_highlighted | Promoted flag | Search |
properties | All structured listing properties as label -> value (Zustand, Versand verfügbar, ...) | Detail |
condition | Item condition (e.g. Neu, Gebraucht), taken from the structured properties | Detail |
article_number | Article number / reference (structured property, else an Artikelnummer: / Artikelreferenz: line in the description) | Detail + description |
dimensions | Dimensions (structured property, else an Abmessungen: / Gesamtmasse: line in the description) | Detail + description |
scraped_at | Time the row was scraped | Search |
source_url | Link to listing on tutti.ch | Both |
Output example
{"id": "45678901","title": "IKEA Kallax Regal weiss 4x4","price": "CHF 80.–","price_chf": 80,"currency": "CHF","category": "Möbel","location": "Zürich, 8005","canton": "ZH","postcode": "8005","seller_name": "Sandra M.","seller_type": "private","listing_source": "tutti","condition": "Gebraucht","article_number": null,"dimensions": "147 x 147 x 39 cm","properties": { "Zustand": "Gebraucht", "Versand verfügbar": "Ja" },"image_count": 4,"posted_at": "2026-04-18T10:00:00Z","source_url": "https://www.tutti.ch/de/vi/zuerich/moebel/ikea-kallax-regal/45678901","scraped_at": "2026-04-20T08:00:00Z"}
Fields marked Detail in the table above are only filled when includeDetails is true.
Pricing
No start fee — pay only for results:
| Event | Cost |
|---|---|
| Listing (basic) | $0.003 |
| Listing (with details) | $0.005 |
100 listings = $0.30 (basic) or $0.50 (with details)
Examples
Search by keyword (copy the URL straight from your browser)
The simplest way to get started: search on tutti.ch, copy the URL from your browser bar, and paste it in.
{"searchUrls": ["https://www.tutti.ch/de/li/ganze-schweiz?q=omega"],"maxResults": 50}
This is the share-link format tutti.ch produces when you search and copy the URL. Both ?q= and ?query= work.
BMW Cabriolets with petrol engine (full-filter URL from tutti.ch)
When you apply category filters on tutti.ch, the URL contains an encoded search token. Paste those URLs in too:
{"searchUrls": ["https://www.tutti.ch/de/q/autos/Ak6NibXekY2Fyc5SSkrFjYXJzQXV0b1Njb3V0VHlwZaljYWJyaW9sZXSStWNhcnNBdXRvU2NvdXRGdWVsVHlwZaZwZXRyb2zAwMA?sorting=newest&query=bmw"],"maxResults": 50}
Multiple searches in one run
{"searchUrls": ["https://www.tutti.ch/de/q/immobilien/Ak8CuaW1tb2JpbGllbpTAwMDA?query=wohnung","https://www.tutti.ch/de/q/elektronik/Ak8CrGVsZWN0cm9uaWNzlMDAwMA?query=iphone"],"maxResults": 200,"maxResultsPerQuery": 100}
All listings (no filter)
{"maxResults": 100,"includeDetails": true}
Monitoring / delta mode
Use this actor to watch a search for new listings without paying to re-scan items you have already seen.
Set sortBy to newest (the default) and maxAgeHours to the interval between your scheduled runs. On each run the actor returns only listings posted within that window, and it stops paginating as soon as it sees three consecutive items older than the cutoff. You pay only for the fresh pages, not the full catalogue.
Example: monitor iPhone listings every 6 hours
{"searchUrls": ["https://www.tutti.ch/de/li/ganze-schweiz?q=iphone"],"maxResults": 200,"maxResultsPerQuery": 100,"sortBy": "newest","maxAgeHours": 6}
Schedule this input every 6 hours and you get a delta feed of new listings only.
How the early-stop works
When sortBy=newest is active and maxAgeHours is set, the actor tracks consecutive stale items per query. After three stale items in a row it stops fetching further pages for that query and logs an INFO line like:
[tutti-ch] early-stopped pagination for query "keyword=iphone": 3 consecutive stale items (> 6h) — saved 8 pages
One or two highlighted or promoted listings may appear out of chronological order on a page, so the actor waits for three consecutive stale items before stopping rather than one.
URL-level sort wins
If your Search URL already contains ?sorting=..., that value takes priority over the sortBy input field. This is intentional: URL-level parameters encode the exact search you configured on tutti.ch, and the input field is a convenience for plain keyword searches where no URL-level sort exists.
Combination that does not save pages
If you set maxAgeHours with a sort other than newest (for example sortBy=cheapest), the early-stop is disabled because oldest items can appear anywhere in a price-sorted list. The output filter still applies, but you pay for all pages up to maxResultsPerQuery.
Input fields
| Field | Type | Description |
|---|---|---|
searchUrls | array | One or more tutti.ch search or listing URLs |
maxResults | integer | Total result cap across all searches |
maxResultsPerQuery | integer | Cap per search URL |
sortBy | string | newest (default), oldest, cheapest, expensive, relevant |
maxAgeHours | integer | Drop items older than N hours; stop paginating once the cutoff is passed (requires sortBy=newest) |
includeDetails | boolean | Fetch detail page for GPS, all images, seller ID |
FAQ
Do I need a proxy or a tutti.ch login? No. The actor handles Swiss proxy routing itself and only reads public pages. There is no proxy input to configure.
Can I scrape one category or filter combination?
Yes. Set the filters on tutti.ch, copy the URL from your browser and paste it into Search URLs. A single listing URL (/de/vi/...) also works.
How many listings can I get per run?
Up to 5000 in total (maxResults) and 5000 per search URL (maxResultsPerQuery).
How do I get only new listings?
Use sortBy: newest with maxAgeHours and schedule the run at that interval. See Monitoring / delta mode above.
How fresh is the data? Every run reads tutti.ch live, so results reflect the site at run time.
Related Actors
European Classifieds
- Kleinanzeigen.de Scraper — Germany
- Willhaben.at Scraper — Austria
- Marktplaats.nl Scraper — Netherlands
- Subito.it Scraper — Italy
- Njuskalo.hr Scraper — Croatia
Real Estate
Enrich your data
Data protection
This actor returns only data that is publicly visible on the source pages. Results can include personal data, such as names, phone numbers, email addresses and addresses of private persons, sole traders or contact persons. Where the source labels an entry type, it is included so you can filter the results yourself.
You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.
Issues & Feedback
Missing something or not working as expected? Open an issue and we'll fix it.