# Swiss Classifieds Scraper for Tutti.ch: Prices, Photos, New Ads (`getascraper/tutti-ch-scraper`) Actor

Scrape Swiss classifieds from tutti.ch by keyword, category and canton. Every row has a clean CHF price, photos, location with canton, seller type and posting date. Monitor mode returns only new, repriced, re-listed and removed ads. Export to Excel, Sheets or JSON. $2.00 per 1K listings.

- **URL**: https://apify.com/getascraper/tutti-ch-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

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

## 🛍️ Swiss Classifieds Scraper for Tutti.ch: Prices, Photos, New Ads

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#FDF2F4;border:1px solid #F3CBD2;border-top:4px solid #C8102E;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Spot the underpriced bike, phone or sofa in Switzerland before anyone else does</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Pull tutti.ch listings by keyword, category, canton and price into a clean spreadsheet. Schedule it, and every run returns only the new listings, price drops and removed ads.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3CBD2;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#8E0C21">🔎 No search links to hunt</span><br>
<span style="font-size:12px;color:#57534E">Pick a keyword, category, canton and price range in the form. Pasted links work too.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3CBD2;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#8E0C21">💰 Prices you can sort</span><br>
<span style="font-size:12px;color:#57534E">A real number in CHF, never a fake 0. Free items and price on request are flagged.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3CBD2;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#8E0C21">📦 Everything in one row</span><br>
<span style="font-size:12px;color:#57534E">Location, photos, condition, car and property details and seller join date. No extra step.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F3CBD2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#8E0C21">🔔 Pay only for what changed</span><br>
<span style="font-size:12px;color:#57534E">The first monitor run is free. Unchanged listings are never charged.</span>
</td>
</tr>
</table>

Swiss Classifieds Scraper collects second-hand listings from tutti.ch, Switzerland's general classifieds marketplace. Each row holds the price, place, photos, condition and category details you would otherwise open every ad to find. No tutti.ch account, login or key is needed.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by tutti.ch, Ricardo or Swiss Marketplace Group.

### 🔍 What does Swiss Classifieds Scraper do?

It turns a tutti.ch search into a flat spreadsheet, one row per listing. You choose what to look for, where, and how many results you want.

- **Search**: filter by keyword, one or more of 107 categories, any of the 26 cantons or named cities (with an optional radius), price range, free items, private or business sellers, and ad language. Sort by newest, oldest, price or relevance.
- **Paste links**: drop in a tutti.ch search, a single listing or a seller page. Search links keep their filters.
- **Monitor**: run the same search on a schedule. Each run returns only new listings, price drops, price increases, renewed ads and ads that disappeared.

Large searches are read in parts so you still get close to every match. The run summary shows how many listings tutti.ch reports and how many you received, with the reason for any gap.

### 👥 Who uses it

- **Resellers and flippers**: "I check for bikes, consoles and phones listed below market price, and I want to see them within minutes of going up."
- **Trade-in and valuation teams**: "I need the going used price by model, condition and canton, refreshed every week."
- **Dealers**: "I track what other dealers hold in stock and which of their prices just dropped."
- **Price researchers and journalists**: "I count how many listings exist for a category and how asking prices move over time."
- **Bargain hunters**: "I want every free item in my canton, the day it is posted."
- **Data teams**: "We need the same columns every run, with empty values left empty instead of made-up ones."

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3CBD2;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Say what you want</span><br>
<span style="font-size:12px;color:#57534E">Type a keyword, pick categories and cantons, set a price range. Or paste tutti.ch links.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3CBD2;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose search or monitor</span><br>
<span style="font-size:12px;color:#57534E">Search returns listings now. Monitor remembers the last run and reports only changes.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FDF2F4;border:1px solid #F3CBD2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Download or schedule</span><br>
<span style="font-size:12px;color:#57534E">Export to Excel, CSV or JSON, or run it every hour or every day.</span>
</td>
</tr>
</table>

The default input returns 25 recent bike listings from the canton of Zurich in a few seconds, so you can see the full output before you change anything.

### 🔔 Monitor new listings and price drops

Pick **Monitor changes** as the mode, set your filters and schedule the Actor. The first run records what is listed today. It is free and saves no rows, unless you turn on **Save the first run's listings**. After that, each run returns only:

| Change | Meaning |
|---|---|
| `NEW` | A listing that was not there last run |
| `PRICE_DROP` / `PRICE_INCREASE` | The price moved. The row shows the previous price and the change in percent |
| `BUMPED` | The seller renewed the ad. It moved back to the top with a newer date |
| `REMOVED` | The listing is gone from tutti.ch |

Unchanged listings produce no row and cost nothing. Give each monitor a name so its memory is shared across scheduled runs. To catch removed listings, set **Monitor scan limit** above the number of matches.

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `mode` | enum | No | `search` (default), `urls` (paste tutti.ch links) or `monitor` (changes only). |
| `startUrls` | array of URLs | No | Search, listing or seller links. Used in `urls` mode. |
| `keyword` | string | No | Words to find in titles and descriptions. Default `velo`. |
| `categories` | array of enums | No | One or more of 107 categories. A group such as Vehicles covers every category inside it. |
| `cantons` | array of enums | No | Any of the 26 cantons. Default Zurich. Leave empty with no cities for all of Switzerland. |
| `cities` | array of strings | No | Towns and cities by name, for example Bern or St. Gallen. |
| `radiusKm` | integer | No | Also include listings within this many kilometres of each city. |
| `minPrice` / `maxPrice` | integer | No | Asking price range in CHF. |
| `freeOnly` | boolean | No | Only items offered for free. |
| `sellerType` | enum | No | `any` (default), `private` or `commercial`. |
| `adLanguages` | array of enums | No | Only ads written in German, French or Italian. |
| `includePartnerSites` | boolean | No | Also include ads that come from partner marketplaces. Off by default. |
| `sort` | enum | No | Newest, oldest, price low to high, price high to low, or relevance. |
| `maxItems` | integer | No | Most listings per run (per link in `urls` mode). Default 25. |
| `maxImages` | integer | No | Photo links per listing, 0 to 15. Default 5. |
| `language` | enum | No | Language of category names in the output: English (default), German, French or Italian. |
| `includeSellerIdentity` | boolean | No | Adds the seller's display name, account ID and profile link. Off by default. |
| `monitorScanLimit` | integer | No | Monitor mode: how many of the newest matches to check each run. Default 5000. |
| `stateName` | string | No | Monitor name, so several runs share one memory. |
| `baselineRows` | boolean | No | Also save the listings found on the first monitor run. |
| `proxyConfiguration` | object | No | Connection settings. Leave the default. |

### 📤 Output example

```json
{
  "schemaVersion": 1,
  "id": "82275250",
  "url": "https://www.tutti.ch/de/vi/zuerich/sport-outdoor/velos/moustache/82275250",
  "title": "MOUSTACHE",
  "description": "Guten Tag \n\nIch gebe ein Damen e-Bike ab vom Hersteller MOUSTACHE, Model X Road Samedi 27. \n\nUnterstützung bis 25Km/h.  \n \nMotor von BOSCH Performance...",
  "priceText": "1'050.-",
  "price": 1050,
  "currency": "CHF",
  "priceType": "fixed",
  "listedAt": "2026-10-10T03:34:56.000Z",
  "category": "Bicycles",
  "categoryId": "bicycles",
  "parentCategory": "Sports & Outdoors",
  "parentCategoryId": "sportsOutdoors",
  "postcode": "8620",
  "city": "Wetzikon ZH",
  "canton": "ZH",
  "cantonName": "Zürich",
  "latitude": 47.31916809082031,
  "longitude": 8.807463645935059,
  "images": [
    "https://c.tutti.ch/big/2982940807.jpg",
    "https://c.tutti.ch/big/5575852348.jpg"
  ],
  "imageCount": 10,
  "sellerType": "commercial",
  "sellerPlan": "tutti_pro",
  "sellerMemberSince": "2018-04-13T08:48:48.015Z",
  "isPromoted": false,
  "source": "tutti",
  "language": "de",
  "condition": "Gebraucht",
  "shippingAvailable": true,
  "scrapedAt": "2026-10-10T11:02:56.572Z"
}
```

A value the listing does not state is left out of the row. You will never see placeholders like "N/A" or "Unknown", and a missing price is never shown as 0.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `id`, `url` | string | Listing number and link |
| `title`, `description` | string | Listing text as the seller wrote it, with any phone numbers and e-mail addresses removed |
| `price`, `currency` | number / string | Asking price in CHF. Left out for free items, price on request and unpriced ads |
| `priceText` | string | The price exactly as shown, for example 1'050.- or Gratis |
| `priceType` | string | `fixed`, `free` or `on_request` |
| `pricePeriod` | string | `month`, `week`, `day` or `year` for rentals priced per period |
| `listedAt` | string | Latest listing date shown on the site (ISO 8601). Renewed ads show their newest date |
| `category`, `categoryId`, `parentCategory`, `parentCategoryId` | string | Category names and stable identifiers |
| `postcode`, `city`, `canton`, `cantonName` | string | Where the listing is |
| `latitude`, `longitude` | number | Map position. Rounded to about 1 km for private sellers |
| `coordinatesApproximate` | boolean | True when the position was rounded |
| `images`, `imageCount` | array / integer | Photo links (full size) and how many photos the listing has |
| `sellerType` | string | `private` or `commercial`, when the site shows it |
| `sellerPlan`, `sellerMemberSince` | string | Seller plan and join date |
| `isPromoted` | boolean | Paid, highlighted placement |
| `source` | string | `tutti`, or the partner marketplace the ad came from |
| `language` | string | Language the ad is written in: `de`, `fr` or `it` |
| `condition`, `shippingAvailable` | string / boolean | Condition and shipping option, where the category has them |
| `attributes` | object | Category details with English names: brand, model, year, mileageKm, fuelType, rooms, areaM2 and more |
| `attributesRaw` | object | The same details with the labels exactly as the site shows them |
| `sellerAlias`, `sellerId`, `sellerUrl` | string | Seller name, account ID and profile link (only with `includeSellerIdentity`) |
| `changeType`, `changeDetectedAt`, `previousPrice`, `priceChangePct`, `firstSeenAt`, `lastSeenAt` | mixed | Monitor mode change details |
| `scrapedAt`, `schemaVersion` | string / integer | Collection time and schema version |

The run's **RUN_SUMMARY** record shows, for each search, how many listings tutti.ch reports and how many were delivered, plus any places, categories or links that were skipped. If fewer listings arrive than expected, the log says so with the gap.

### 💰 Pricing

This Actor uses pay per event: you pay per listing saved, and in monitor mode only per change found. The price is $2.00 per 1,000 listings on the free plan, and lower on paid plans. Full listing detail is included in that price. Empty searches, unchanged monitor listings and the first monitor run cost nothing. There is no subscription.

Free plan runs are limited to 25 listings per run, 3 runs per day, and a 30-minute wait between runs.

### ⭐ Enjoying Tutti.ch Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#FDF2F4;border:1px solid #F3CBD2;border-left:5px solid #C8102E;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Found a bargain, or saved a morning of copying prices into a spreadsheet?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other resellers and price researchers find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#C8102E;border:1px solid #F3CBD2;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/tutti-ch-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 💡 Tips

- For a used-price benchmark, search one category and canton, sort by price, and read `condition` and `attributes` next to `price`.
- Cars carry brand, model, year, mileage, fuel, gearbox and power as separate typed columns, so they filter and pivot cleanly.
- To see only private sellers' bargains, set **Seller type** to private and sort by newest.
- Set **Photos per listing** to 0 for a lighter file when you only need prices and places.
- Monitoring many searches? Give each one its own **Monitor name**.

### ❓ FAQ

**Do I need a tutti.ch account or API key?**
No. The Actor reads publicly listed information only. There is nothing to log into and no key to set up.

**Does it collect phone numbers or e-mail addresses?**
Never. Contact details are not collected, and phone numbers or e-mail addresses that a seller typed into a title or description are replaced with \[removed]. Seller names are off by default and appear only if you switch on **Include seller name and ID**.

**How fresh is the data?**
Each run reads tutti.ch when it runs. Schedule a monitor to get new listings and price drops as often as you need.

**Why are some prices empty?**
Free items, ads with "price on request" and ads without a price have no number to report. They are labelled with `priceType` instead of a fake 0.

**Does it include anibis.ch or Ricardo listings?**
It returns tutti.ch ads. Ads shown on tutti.ch from partner marketplaces are left out unless you turn on **Include partner-site ads**, and each such row says where it came from.

**Is it legal to scrape tutti.ch?**
The Actor collects publicly visible listing information. The site's terms limit automated use, so check that your use case is allowed. Listings can contain personal data, so follow the Swiss data protection act (nDSG) and GDPR where they apply. Private sellers' map positions are rounded, and no contact details are collected.

### 🔗 Other actors

- [Mercari US Scraper](https://apify.com/getascraper/mercari-us-scraper) ↗ - Active and sold Mercari listings with price and seller data.
- [Mercari Sold Comps Scraper](https://apify.com/getascraper/mercari-sold-comps-scraper) ↗ - Sold prices, sell-through and days to sell for resale research.
- [OLX Marketplace Scraper](https://apify.com/getascraper/olx-marketplace-scraper) ↗ - Classified ads with prices and postal codes across 7 countries.
- [Marktplaats Cars Scraper](https://apify.com/getascraper/marktplaats-cars-scraper) ↗ - Dutch used cars with prices and seller data.
- [Kleinanzeigen Cars Scraper](https://apify.com/getascraper/kleinanzeigen-cars-scraper) ↗ - German used cars with dealer data.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/tutti-ch-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Search listings with the fields below, paste tutti.ch links (searches, single listings or seller pages), or monitor a search for changes. Monitor mode is built for schedules: after a free first run it returns only new listings, price drops, price increases, renewed and removed listings, and unchanged listings are never charged.

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

Used in 'Paste tutti.ch links' mode. Paste a search page (its keyword, category, place and price filters are kept), a single listing, or a seller page (the seller's current listings). Each search link returns up to 'Max listings'. Links that cannot be read are listed in the run summary, never saved as empty rows.

## `keyword` (type: `string`):

Words to look for in titles and descriptions, for example 'velo', 'iphone 13' or 'sofa'. Leave empty to browse by category, place or price only.

## `categories` (type: `array`):

Limit the search to one or more categories. Picking a group such as 'Vehicles (all)' searches every category inside it. Leave empty for all categories.

## `cantons` (type: `array`):

Only listings located in these cantons. Pick as many as you like; no codes or search links to look up. Leave empty (and leave Cities empty) to search all of Switzerland.

## `cities` (type: `array`):

Only listings in these towns or cities, for example 'Bern', 'St. Gallen' or 'Lausanne'. Combine with Cantons to cover both. A city that is not recognised is reported in the log and skipped.

## `radiusKm` (type: `integer`):

Also include listings within this many kilometres of each city above. Only applies when you enter cities and no cantons.

## `minPrice` (type: `integer`):

Lowest asking price to include. Listings with no price (free items, price on request) are not matched by a price range.

## `maxPrice` (type: `integer`):

Highest asking price to include.

## `freeOnly` (type: `boolean`):

Return only listings offered for free. Overrides the price range above.

## `sellerType` (type: `string`):

Private sellers only, businesses only, or both. Handy for finding private bargains or tracking dealer stock.

## `adLanguages` (type: `array`):

Only ads written in these languages. Leave empty for all.

## `includePartnerSites` (type: `boolean`):

tutti.ch also shows ads that come from partner marketplaces. Off by default so every row is a tutti.ch ad. Turn on to match what the website shows; each row's 'source' field tells you where it came from.

## `sort` (type: `string`):

Newest first returns the most recently published or renewed listings first. Price sorts put the cheapest or most expensive first (free items count as cheapest).

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

Stop after this many listings. Searches larger than one pass can read are split automatically so you still get complete coverage up to this number, and the run summary shows how many matches the source reported versus how many were delivered. Free-plan runs are capped at 25.

## `maxImages` (type: `integer`):

Most photo links to keep per listing (full-size). Set 0 to leave photos out.

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

Language of the category names in the output. Listing titles and descriptions stay in the language the seller wrote them.

## `includeSellerIdentity` (type: `boolean`):

Adds the seller's public display name, account ID and profile link to each row. Off by default because display names are often real names. No phone numbers or e-mail addresses are ever collected.

## `monitorScanLimit` (type: `integer`):

Monitor mode only: how many of the newest matching listings to check on each run. Set it at or above the number of matches so removed listings can be detected. Does not apply to search mode.

## `stateName` (type: `string`):

Optional name for the monitor's memory. Runs that share a name share history, so give each scheduled search its own name. Left empty, the same filters always continue the same history.

## `baselineRows` (type: `boolean`):

By default the first monitor run only records what exists today (free) and saves no rows. Turn on to also save those listings; they are charged like search results.

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

The default proxy settings are required for this Actor to reach listings. Leave them as they are.

## Actor input object example

```json
{
  "mode": "search",
  "startUrls": [
    {
      "url": "https://www.tutti.ch/de/q/autos/Ak8CkY2Fyc5TAwMDA"
    }
  ],
  "keyword": "velo",
  "cantons": [
    "ZH"
  ],
  "freeOnly": false,
  "sellerType": "any",
  "includePartnerSites": false,
  "sort": "newest",
  "maxItems": 25,
  "maxImages": 5,
  "language": "en",
  "includeSellerIdentity": false,
  "monitorScanLimit": 5000,
  "baselineRows": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CH"
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "mode": "search",
    "startUrls": [
        {
            "url": "https://www.tutti.ch/de/q/autos/Ak8CkY2Fyc5TAwMDA"
        }
    ],
    "keyword": "velo",
    "cantons": [
        "ZH"
    ],
    "freeOnly": false,
    "sellerType": "any",
    "includePartnerSites": false,
    "sort": "newest",
    "maxItems": 25,
    "maxImages": 5,
    "language": "en",
    "includeSellerIdentity": false,
    "monitorScanLimit": 5000,
    "baselineRows": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CH"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/tutti-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 = {
    "mode": "search",
    "startUrls": [{ "url": "https://www.tutti.ch/de/q/autos/Ak8CkY2Fyc5TAwMDA" }],
    "keyword": "velo",
    "cantons": ["ZH"],
    "freeOnly": False,
    "sellerType": "any",
    "includePartnerSites": False,
    "sort": "newest",
    "maxItems": 25,
    "maxImages": 5,
    "language": "en",
    "includeSellerIdentity": False,
    "monitorScanLimit": 5000,
    "baselineRows": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CH",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/tutti-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 '{
  "mode": "search",
  "startUrls": [
    {
      "url": "https://www.tutti.ch/de/q/autos/Ak8CkY2Fyc5TAwMDA"
    }
  ],
  "keyword": "velo",
  "cantons": [
    "ZH"
  ],
  "freeOnly": false,
  "sellerType": "any",
  "includePartnerSites": false,
  "sort": "newest",
  "maxItems": 25,
  "maxImages": 5,
  "language": "en",
  "includeSellerIdentity": false,
  "monitorScanLimit": 5000,
  "baselineRows": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CH"
  }
}' |
apify call getascraper/tutti-ch-scraper --silent --output-dataset

```

## MCP server setup

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