# Comparis.ch Scraper: Swiss Real Estate & Cars (with Emails) (`maximedupre/comparis`) Actor

Collect Swiss property and car listings from Comparis search or listing URLs. Get prices, locations, photos, and listing details, with optional business contact email search.

- **URL**: https://apify.com/maximedupre/comparis.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Real estate, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

### 🏠 Collect Swiss property and car listings from Comparis

Comparis Scraper helps property researchers, car dealers, and market analysts collect public Swiss listings in one dataset. Add Comparis search or listing URLs to get prices, locations, photos, property facts, car specs, and available contacts. Use the data to compare offers and track inventory across runs. You can also search agency and dealer websites for business contact emails.

- Use the **[Comparis Rental Listings Scraper](https://apify.com/maximedupre/comparis/examples/comparis-rental-listings-scraper)** to collect rental offers for price research.
- Collect homes for sale with the **[Comparis Property Sale Listings Scraper](https://apify.com/maximedupre/comparis/examples/comparis-property-sale-listings-scraper)** for property market checks.
- Use the **[Comparis Car Listings Scraper](https://apify.com/maximedupre/comparis/examples/comparis-car-listings-scraper)** to compare car prices and specs.
- Find business contacts for property research with **[Comparis Real Estate Agency Emails](https://apify.com/maximedupre/comparis/examples/comparis-real-estate-agency-emails)**.
- Find business contacts for car market research with **[Comparis Car Dealer Emails](https://apify.com/maximedupre/comparis/examples/comparis-car-dealer-emails)**.

#### 📦 Property facts, car specs, and contacts

Each row is one property or car listing. Property rows can include rent costs, rooms, area, amenities, documents, and source price history. Car rows can include make, model, mileage, fuel, transmission, and other specs. Both can include prices, locations, images, and contact details when available.

The Actor saves the first eligible occurrence of a listing and ignores later matches in the same run. Optional details depend on what the source shows. Business website findings can include emails, payment processors, and commerce platforms when available. These findings are not guaranteed.

#### ▶️ Run a Comparis listing search

1. Open Comparis and choose a property or car search with the filters you need.
2. Copy the search URL into **Comparis URLs**, or add individual listing URLs. You can mix properties and cars.
3. Set **Maximum listings** if you want a limit for the whole run.
4. Turn on **Find business contact emails** if you need the extra website search.
5. Start the run and open the dataset to review or export your listings.

Public listings do not need a Comparis login. Search URLs keep the filters you chose on Comparis.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `startUrls` | array of objects | Required list of public Comparis property or car search and listing URLs. Both marketplaces can be used in one run. |
| `startUrls[].url` | string | Search URL with your Comparis filters, or an individual listing URL. |
| `maxItems` | integer | Optional maximum listings across all URLs. Use a positive number. Leave it empty to return all available results until the source is exhausted. |
| `discoverContactEmails` | boolean | Search agency and dealer websites for contact emails. Defaults to `false`. Each listing with an email found this way has a separate charge. Contact details shown on Comparis are included when available. |

**Example input**

This input came from a successful default-input run on the current beta build.

```json
{
  "startUrls": [
    {
      "url": "https://www.comparis.ch/immobilien/result/list"
    }
  ],
  "maxItems": 10,
  "discoverContactEmails": false
}
```

#### 🧾 Output

The Output tab has a `listings` link to the dataset. Each row has either a `property` object or a `vehicle` object. Optional fields may be absent when the source does not provide them. Dotted paths below show fields inside nested objects and arrays.

**Property listing fields**

| Field | Type | What it does |
| --- | --- | --- |
| `listingType` | string | `property` for this shape. |
| `id` | string | Comparis listing ID for matching listings across runs. |
| `url` | string | Source listing URL. |
| `title` | string | Source listing title. |
| `description` | string | Source description, which can contain HTML. |
| `status` | string | Status value stated by the source. |
| `price` | object | Asking price and available rent costs. |
| `price.amount` | number | Asking price amount. |
| `price.currency` | string | Price currency. |
| `price.period` | string | Source payment period. |
| `price.netRent` | number | Rent before ancillary costs. |
| `price.ancillaryCosts` | number | Ancillary cost amount. |
| `price.grossRent` | number | Rent including ancillary costs. |
| `location` | object | Source address and coordinates. |
| `location.street` | string | Street address. |
| `location.postalCode` | string | Postal code. |
| `location.city` | string | City or town. |
| `location.canton` | string | Swiss canton. |
| `location.country` | string | Country. |
| `location.latitude` | number | Source latitude. |
| `location.longitude` | number | Source longitude. |
| `images` | array of strings | Source image URLs. |
| `contacts` | array of objects | Listing contacts and available business website findings. |
| `contacts[].name` | string | Person or business name. |
| `contacts[].role` | string | Source contact role. |
| `contacts[].phone` | string | Public phone number. |
| `contacts[].address` | string | Public contact address. |
| `contacts[].websiteUrl` | string | Business website found for the contact. |
| `contacts[].emails` | array of strings | Public contact emails. |
| `contacts[].paymentProcessors` | array of strings | Payment processors observed on the business website. |
| `contacts[].commercePlatforms` | array of strings | Commerce platforms observed on the business website. |
| `property` | object | Property facts. |
| `property.category` | string | Source property category. |
| `property.dealType` | string | Rental or sale offer type. |
| `property.rooms` | number | Number of rooms. |
| `property.livingArea` | number | Living area in square meters. |
| `property.floor` | string | Source floor text. |
| `property.renovation` | string | Source renovation details. |
| `property.availableFrom` | string | Source availability date or text. |
| `property.amenities` | array of strings | Listed amenities. |
| `property.parking` | array of strings | Parking details. |
| `property.constructionYear` | integer | Year the building was built. |
| `property.landArea` | number | Land area in square meters. |
| `property.usableArea` | number | Usable area in square meters. |
| `property.buildingVolume` | number | Building volume in cubic meters. |
| `property.documents` | array of objects | Linked source documents. |
| `property.documents[].title` | string | Source document title. |
| `property.documents[].url` | string | Document URL. |
| `property.discoveredAt` | string | Date when Comparis first found the listing, as stated by Comparis. |
| `property.priceHistory` | array of objects | Price history published by the source. |
| `property.priceHistory[].date` | string | Price entry date. |
| `property.priceHistory[].amount` | number | Price at that date. |
| `property.priceHistory[].currency` | string | Source currency for that price. |
| `property.valuationRating` | string | Property valuation rating published by Comparis. |

**Property example**

This complete row from a successful current-beta run shows a rental listing with a document link and business contact emails.

```json
{
  "listingType": "property",
  "id": "38173117",
  "url": "https://www.comparis.ch/immobilien/marktplatz/details/show/38173117",
  "title": "150 m2 Praxis-/ Bürofläche in Glattbrugg - individuell ausbaubar",
  "description": "An zentraler Lage in Glattbrugg / Opfikon vermieten wir eine ca. 150 m² grosse Praxis- und Bürofläche, die individuell nach den Bedürfnissen der zukünftigen Mieterschaft ausgebaut werden kann.<br /><br />Ideal geeignet für Praxis, Physiotherapie, Psychologie/Psychotherapie, medizinische Dienstleistungen, Massage, Therapie, Beratung oder Büronutzung.<br /><br />Ihre Vorteile<br /><br />ca. 150 m² Mietfläche<br /><br />2 Balkone mit total ca. 15 m² inklusive<br /><br />Kellerraum im UG inklusive<br /><br />flexible Gestaltung und individueller Ausbau möglich<br /><br />WC-Anlagen werden noch ausgebaut<br /><br />Einstellhallenplatz verfügbar<br /><br />2 Motorrad-Parkplätze optional<br /><br />Mietkonditionen<br /><br />Mietzins: CHF 3'750.–/Monat ( incl. CHF 250,- Nebenkosten)<br />(CHF 300.–/m²/Jahr)<br /><br />Einstellhallenplatz: CHF 150.–/Monat<br />2 Motorrad-Parkplätze: optional CHF 120.–/Monat<br /><br />Kaution: 6 Monatsmieten<br />Mindestmietdauer: 5 Jahre<br /><br />Gestalten Sie Ihre zukünftige Praxis oder Ihr Büro selbst<br /><br />Der nicht ausgebaute Zustand bietet Ihnen die Möglichkeit, Raumaufteilung und Ausstattung gezielt auf Ihre betrieblichen Anforderungen abzustimmen.<br /><br />Interesse?<br />Gerne zeigen wir Ihnen die Fläche persönlich und besprechen die Nutzungsmöglichkeiten.<br />",
  "status": "0",
  "price": {
    "amount": 3750,
    "currency": "CHF",
    "period": "Mietpreis pro Monat",
    "netRent": 3500,
    "ancillaryCosts": 250,
    "grossRent": 3750
  },
  "location": {
    "street": "Dammstrasse 5",
    "postalCode": "8152",
    "city": "Opfikon",
    "canton": "ZH",
    "country": "CH",
    "latitude": 47.435758356732265,
    "longitude": 8.564661106783085
  },
  "images": [
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/4bba62d1-86b1-9739-3bec-b49f61d495e9.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/7483cc03-f94c-1071-8343-faa2781caefb.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/0fb90245-e4b5-98e3-055c-2f46b542236f.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/063b2ad7-4bfe-4e3f-2870-ae6b0b135944.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/46ce4521-b743-169e-9afc-c8139947fc8c.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/450ff5ec-870b-8980-cc20-d83da51a68f5.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/75020d8f-823a-14d9-308e-bf1691453c8d.jpg",
    "https://mapl-assets.b-cdn.net/immobilien/images/datacollect/1f5c0ad0-41d0-3362-29fa-a5a1b4318eb0.png"
  ],
  "contacts": [
    {
      "name": "Peter Straub Immobilienmanagement",
      "role": "VendorInformation",
      "phone": "+41 79 753 36 15",
      "address": "Mitteldorfstrasse 32, 6315 Oberägeri",
      "websiteUrl": "https://en.straubundpartner.com",
      "emails": [
        "ps@straubundpartner.com",
        "ps@straubundparnter.com",
        "info@straubundpartner.com"
      ]
    }
  ],
  "property": {
    "category": "Gewerbeobjekt",
    "dealType": "rent",
    "rooms": 1,
    "floor": "1. Stock",
    "availableFrom": "sofort",
    "amenities": [
      "Wasseranschluss",
      "Toiletten",
      "Balkon/Terrasse/Sitzplatz",
      "Einstellplatz"
    ],
    "parking": [
      "Einstellplatz"
    ],
    "constructionYear": 2026,
    "usableArea": 150,
    "documents": [
      {
        "title": "zusätzliche Dokumente anzeigen",
        "url": "https://mapl-assets.b-cdn.net/immobilien/documents/datacollect/04e6bc75-4fa2-64ab-7f11-72dee697b335.pdf"
      }
    ],
    "discoveredAt": "2026-10-06T14:31:06"
  }
}
```

**Car listing fields**

| Field | Type | What it does |
| --- | --- | --- |
| `listingType` | string | `vehicle` for this shape. |
| `id` | string | Comparis listing ID for matching listings across runs. |
| `url` | string | Source listing URL. |
| `title` | string | Source listing title. |
| `description` | string | Source listing description. |
| `status` | string | Status value stated by the source. |
| `price` | object | Source price details. |
| `price.amount` | number | Asking price amount. |
| `price.currency` | string | Price currency. |
| `price.period` | string | Payment period, when stated. |
| `price.netRent` | number | Rent before ancillary costs, when stated. |
| `price.ancillaryCosts` | number | Ancillary cost amount, when stated. |
| `price.grossRent` | number | Rent including ancillary costs, when stated. |
| `location` | object | Source location. |
| `location.street` | string | Street address. |
| `location.postalCode` | string | Postal code. |
| `location.city` | string | City or town. |
| `location.canton` | string | Swiss canton. |
| `location.country` | string | Country. |
| `location.latitude` | number | Source latitude. |
| `location.longitude` | number | Source longitude. |
| `images` | array of strings | Source image URLs. |
| `contacts` | array of objects | Seller contacts and available business website findings. |
| `contacts[].name` | string | Person or business name. |
| `contacts[].role` | string | Source contact role. |
| `contacts[].phone` | string | Public phone number. |
| `contacts[].address` | string | Public contact address. |
| `contacts[].websiteUrl` | string | Business website found for the contact. |
| `contacts[].emails` | array of strings | Public contact emails. |
| `contacts[].paymentProcessors` | array of strings | Payment processors observed on the business website. |
| `contacts[].commercePlatforms` | array of strings | Commerce platforms observed on the business website. |
| `vehicle` | object | Car specs from the listing. |
| `vehicle.make` | string | Vehicle make. |
| `vehicle.model` | string | Vehicle model. |
| `vehicle.variant` | string | Source model variant. |
| `vehicle.mileage` | number | Mileage in kilometers. |
| `vehicle.firstRegistration` | string | Source first registration date. |
| `vehicle.condition` | string | Source condition value. |
| `vehicle.fuel` | string | Fuel or energy type. |
| `vehicle.transmission` | string | Transmission type. |
| `vehicle.bodyType` | string | Body type. |
| `vehicle.powerKw` | number | Power in kilowatts. |
| `vehicle.engineCapacity` | number | Engine capacity in cubic centimeters. |
| `vehicle.driveType` | string | Source drive type. |
| `vehicle.doors` | integer | Number of doors. |
| `vehicle.seats` | integer | Number of seats. |
| `vehicle.color` | string | Exterior color. |
| `vehicle.equipment` | array of strings | Listed equipment. |

**Car example**

This complete row from a successful current-beta run shows car specs, price, and seller contact details.

```json
{
  "listingType": "vehicle",
  "id": "33655536",
  "url": "https://www.comparis.ch/carfinder/marktplatz/details/show/33655536",
  "title": "Audi A3",
  "description": "- Motor & Getriebe gut\n- Karosserie hat diverse Kratzer & Beulen\n- 8 Fach bereift\nKeine technische Prüfung (Werkstatttest) vorgenommen.\nFahrzeug ab Platz, ohne Garantie und Aufbereitung.\nFÜR EXPORT",
  "status": "1",
  "price": {
    "amount": 3900,
    "currency": "CHF"
  },
  "images": [],
  "location": {
    "postalCode": "5502",
    "city": "Hunzenschwil"
  },
  "contacts": [
    {
      "name": "Auto Alen Hunzenschwil",
      "role": "AdvertiserInformation",
      "phone": "+41793305628",
      "address": "5502 Hunzenschwil"
    }
  ],
  "vehicle": {
    "make": "Audi",
    "model": "A3",
    "variant": "A3 Sportback 2.0 TFSI Style quattro S-tronic",
    "mileage": 226200,
    "firstRegistration": "06.2010",
    "condition": "2",
    "fuel": "Benzin",
    "transmission": "Automat",
    "bodyType": "Limousine",
    "powerKw": 147.1,
    "engineCapacity": 1984,
    "driveType": "Allrad",
    "doors": 5,
    "seats": 5,
    "color": "Schwarz",
    "equipment": [
      "ABS",
      "Differentialsperre",
      "Elektrische Sitzverstellung",
      "Klimaanlage",
      "Leichtmetallräder",
      "Parksensoren",
      "Sitzheizung",
      "Tempomat"
    ]
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. A **Listing** event is charged for each property or car listing saved to your dataset. With business contact email search enabled, a **Contact email** event is charged once per listing that gets an email from that search.

There is no contact email charge when the search finds no email. Payment processor and commerce platform findings have no extra charge. Contact details already shown on Comparis are included with the listing. See the Apify pricing panel for current rates.

#### 🔌 Integrations

Export your dataset from Apify or read it through the Apify API. Use Apify schedules to repeat a search and compare the saved listings across runs. This guide shows how to connect an Actor to other tools:

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Will every listing have an email address?

No. Contact details depend on the listing and business website. Turn on business contact email search to look for more contacts. The listing is still saved when no email is found.

##### Can I mix property and car URLs?

Yes. Add both kinds to `startUrls`. The listing limit applies across all submitted URLs.

##### What if the same listing appears in more than one search?

The first eligible occurrence is saved. Later matches in that run are ignored. The saved row does not collect details from later matches.

##### How do I collect all available listings?

Leave `maxItems` empty to return all available results until the source is exhausted. Results still depend on what Comparis makes available for your URLs.

##### Does this collect past prices or removed listings?

Property rows can include price history when Comparis publishes it. The Actor does not rebuild missing history or promise access to removed listings. Save datasets from repeated runs if you want to compare inventory over time.

##### Which Comparis pages can I use?

Use public property rental and sale searches, car searches, and individual listing URLs. Broker profile URLs, account pages, and private content are outside this Actor's scope. It does not collect insurance, banking, telecom, or health-insurance comparisons.

##### Do I need a Comparis account?

No. The Actor collects public listings without a Comparis login. It does not submit contact forms or collect lead-form replies.

### 📝 Changelog

**v0.0** (06-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~comparis/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Idealista Agency Scraper](https://apify.com/maximedupre/idealista-agency-scraper) to find real estate agencies from Spanish property search pages.
- [Realtor Scraper](https://apify.com/maximedupre/realtor-scraper) to collect US property listings with prices, addresses, and agent details.
- [Autotrader Scraper](https://apify.com/maximedupre/autotrader-scraper) to research US car listings, specs, and seller details.
- [Carsales.com.au Scraper](https://apify.com/maximedupre/carsales-scraper) to compare Australian car listings, prices, and dealer inventory.
- [Website Email & Contact Scraper](https://apify.com/maximedupre/website-emails-scraper) to find public contact emails from known agency or dealer websites.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Add one or more public Comparis property or car search and listing URLs. Search URLs keep the filters you chose on Comparis. Listing URLs collect those listings directly.

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

Stop after this many listings across all submitted URLs. Leave empty to return all available results until the source is exhausted.

## `discoverContactEmails` (type: `boolean`):

Search agency and dealer websites for contact emails. Each listing with an email found this way has a separate charge. Contact details shown on Comparis are always included when available.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.comparis.ch/immobilien/result/list"
    }
  ],
  "maxItems": 10,
  "discoverContactEmails": false
}
```

# Actor output Schema

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

Open the collected listings in the dataset.

# 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": [
        {
            "url": "https://www.comparis.ch/immobilien/result/list"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/comparis").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": [{ "url": "https://www.comparis.ch/immobilien/result/list" }],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/comparis").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": [
    {
      "url": "https://www.comparis.ch/immobilien/result/list"
    }
  ],
  "maxItems": 10
}' |
apify call maximedupre/comparis --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/comparis"
        }
    }
}
```

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/hH7iSn5ySxUCxzwnl/builds/ruZOcjjWBnurHkCMY/openapi.json
