# Comparis Property Search Scraper (`stealth_mode/comparis-property-search-scraper`) Actor

Efficiently scrape property listings from Comparis.ch, Switzerland's leading real estate comparison platform. Extract comprehensive rental and sale data including prices, locations, property types, and market ratings. Perfect for real estate agencies, market analysts, & property investment research

- **URL**: https://apify.com/stealth\_mode/comparis-property-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Comparis.ch Property Search Scraper: Extract Swiss Real Estate Market Data

### Understanding Comparis.ch and Its Value in Swiss Real Estate

Comparis.ch stands as Switzerland's premier comparison platform for real estate, insurance, and financial services. Its property section aggregates listings from multiple sources, creating the most comprehensive view of the Swiss rental and sales market. Unlike individual agency websites, Comparis provides standardized data across thousands of properties, making it invaluable for market intelligence.

The platform's unique Comparis Points rating system evaluates properties based on price-quality ratio, helping users identify good deals. For analysts, this standardized scoring enables quantitative comparison across different property types, regions, and price segments—insights impossible to gain from fragmented sources.

Switzerland's complex real estate market, with four language regions and significant cantonal variations in pricing and regulations, demands comprehensive data collection. Manually gathering property information across multiple searches, locations, and property types would require extensive time navigating search filters and copying details. The Comparis.ch Property Search Scraper automates this entire process, transforming search results into structured datasets ready for analysis, investment decisions, or competitive intelligence.

### What This Scraper Extracts and Target Users

The Comparis.ch Property Search Scraper processes search result pages, extracting multiple property listings efficiently. This approach is optimal when building databases across different locations, price ranges, or property types without needing to access individual property detail pages.

**Key Data Captured:**

The scraper extracts essential property information including ad identifiers, titles, property types (apartment, house, commercial), addresses, prices with currency, essential information (rooms, square meters), listing dates, and high-quality image URLs. It captures Comparis-specific data like Comparis Points ratings, premium listing status, price development indicators, and partner information (real estate agencies). Additional fields include contact details, property type IDs, deal types (rent/sale), and pricing type classifications.

**Who Should Use This Tool:**

**Real Estate Agencies** monitor competitor listings, pricing strategies, and market inventory levels across different Swiss regions. **Property Investment Firms** analyze market trends, identify undervalued properties through Comparis Points, and assess regional price developments. **Market Research Companies** track rental and sales price evolution, inventory turnover rates, and regional market dynamics. **Relocation Services** build comprehensive property databases for international clients moving to Switzerland. **PropTech Startups** integrate Swiss market data into applications, comparison tools, or investment platforms. **Cantonal Housing Authorities** monitor affordability trends and housing availability for policy development.

### Input Configuration: Navigating Comparis Search URLs

The scraper processes Comparis.ch search result URLs—the pages displaying multiple properties after applying filters. Understanding the URL structure is crucial for targeting specific market segments.

**Example Input Configuration:**

```json
{
  "proxy": {
    "useApifyProxy": false
  },
  "max_items_per_url": 20,
  "ignore_url_failures": true,
  "urls": [
    "https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SwapProperty%22%3Anull%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22ShowComparisPoints%22%3Afalse%7D&page=99"
  ]
}
````

#### Example Screenshot:

![](https://i.postimg.cc/XJ6z1sX6/Screenshot-from-2026-01-03-17-34-42.png)

**Parameter Explanation:**

**proxy configuration:** Set to `false` in this example, meaning no proxy is used. For large-scale scraping or to avoid potential rate limiting, enable Apify's residential proxies by setting `useApifyProxy: true` and selecting appropriate proxy groups. Swiss-based proxies may improve access reliability.

**max\_items\_per\_url:** Controls extraction volume per search page. Setting to 20 extracts up to 20 property listings from each URL. Comparis typically displays 20 properties per page, so this captures complete pages. Adjust higher (50-100) for comprehensive extraction if pages contain more results.

**ignore\_url\_failures:** When `true`, the scraper continues processing remaining URLs even if some fail. Essential when scraping multiple search pages—one broken URL won't stop your entire job. Set to `false` only when you need guaranteed success for every URL.

**urls array:** Contains search result page URLs to scrape. The complex `requestobject` parameter encodes all search filters (deal type, property types, rooms, price ranges, amenities, location). The `page` parameter enables pagination.

**Understanding the Request Object:** The URL-encoded JSON contains filters like:

- `DealType`: 10 (rental), 20 (sale)
- `RoomsFrom/RoomsTo`: Room count range
- `PriceFrom/PriceTo`: Price range in CHF
- `LivingSpaceFrom/LivingSpaceTo`: Square meter range
- `ComparisPointsMin`: Minimum rating threshold
- `LocationSearchString`: City/region targeting
- Amenity filters: `HasBalcony`, `HasParking`, `PetsAllowed`, etc.
- `Sort`: Sorting method (price, date, relevance)

**Building Search URLs:** Perform searches manually on Comparis.ch with desired filters, then copy the resulting URL. For pagination, increment the `page` parameter (page=1, page=2, etc.). For comprehensive market coverage, create multiple URLs with different location or price filters.

**Pro Tip:** Decode the `requestobject` parameter using a URL decoder to understand and modify search filters programmatically. This enables automated generation of search URLs for systematic market coverage.

### Complete Output Structure and Field Definitions

The scraper returns JSON arrays with each property listing as an object. Understanding each field enables effective analysis and application integration.

**Ad ID:** Unique identifier for the property listing on Comparis. **Purpose:** Primary key for databases, tracking specific listings over time, avoiding duplicates in merged datasets, referencing properties in analysis.

**Site ID:** Identifies the source website or partner from which Comparis aggregated the listing. **Purpose:** Tracking which real estate portals contribute properties, analyzing source quality, filtering by preferred partners.

**Ad Status:** Current listing state (active, rented, sold, expired). **Purpose:** Filtering active opportunities, calculating absorption rates, analyzing time-on-market before status changes.

**Title:** Property listing headline as displayed in search results. **Purpose:** Quick property identification, keyword extraction for categorization, display in user interfaces.

**Property Type Text:** Human-readable property classification (e.g., "Apartment," "House," "Studio," "Commercial Space"). **Purpose:** Categorizing inventory by type, filtering searches, analyzing market composition by property category.

**Address:** Complete property address including street, postal code, and city. **Purpose:** Geographic analysis, location-based filtering, mapping properties, analyzing neighborhood-level pricing.

**Essential Information:** Condensed property details typically including room count and living space (e.g., "3.5 rooms, 85 m²"). **Purpose:** Quick filtering by size requirements, calculating price per square meter, standardizing property comparisons.

**Price:** Rental price (monthly) or sale price depending on deal type. **Purpose:** Primary valuation metric, price trend analysis, affordability calculations, market segmentation.

**Currency:** Always CHF for Swiss properties but included for data standardization. **Purpose:** International data integration, multi-currency analysis for cross-border investors.

**Date:** Listing publication or last update date. **Purpose:** Freshness indicator, calculating time-on-market, identifying newly listed properties, tracking inventory turnover.

**Image URL:** Direct link to primary property image. **Purpose:** Visual display in applications, image analysis (architecture styles, property condition), enhancing user engagement.

**Is Premium Listed:** Boolean indicating whether agency paid for premium placement. **Purpose:** Identifying highly promoted properties, analyzing premium listing effectiveness, competitive intelligence on agency marketing spend.

**Comparis Points:** Proprietary rating (typically 0-100) evaluating price-quality ratio. **Purpose:** Identifying good deals, quantitative property comparison, filtering by value threshold, market efficiency analysis.

**Partner Logo URL:** Link to real estate agency or partner logo. **Purpose:** Visual branding in displays, identifying listing sources, tracking agency market presence.

**Partner Name:** Real estate agency or portal name managing the listing. **Purpose:** Analyzing agency market share, filtering by preferred partners, competitive agency benchmarking.

**Contact Information:** Phone numbers, email addresses, or contact methods for inquiries. **Purpose:** Direct lead generation, contact preference analysis, integration with CRM systems.

**Price Development Direction:** Indicator showing if price increased, decreased, or remained stable since listing. **Purpose:** Identifying price-reduced properties (potential negotiation opportunities), tracking market dynamics, seller motivation signals.

**Price Value:** Numeric price for computational analysis (may differ from displayed price format). **Purpose:** Mathematical operations, price statistics, sorting and filtering algorithms.

**Area Value:** Numeric living space in square meters. **Purpose:** Calculating price per m², size-based filtering, standardized comparisons, market analysis by property size.

**Property Type ID:** Numeric code for property category. **Purpose:** Database normalization, programmatic filtering, classification algorithms, cross-referencing with property taxonomies.

**Deal Type:** Numeric code indicating rental (10) or sale (20) transaction. **Purpose:** Segmenting rental vs. sales markets, separate analysis of investment vs. rental trends.

**Use Internal Links:** Boolean indicating whether to use Comparis internal property URLs. **Purpose:** Navigation control in applications, determining whether to redirect users to Comparis or external partner sites.

**Show Comparis Rating:** Boolean controlling rating display visibility. **Purpose:** UI presentation logic, filtering properties with/without ratings.

**Member Logo URL:** Additional logo field for Comparis member agencies. **Purpose:** Enhanced branding for premium members, distinguishing member vs. non-member listings.

**Show Default Personalization Segment:** Boolean for personalized recommendation systems. **Purpose:** Algorithmic property matching, user preference learning systems.

**Price Type Text:** Classification like "Monthly Rent," "Purchase Price," "Annual Rent." **Purpose:** Clarifying pricing context, standardizing comparison (converting annual to monthly), display formatting.

**Sample Output:**

```json
[
  {
  "ad_id": 36438977,
  "site_id": 254,
  "ad_status": 0,
  "title": "Appartement rénové de 3.5 pièces, 102 m², vieille ville",
  "property_type_text": "Wohnung",
  "address": [
    "Estavayer-le-Lac",
    "1470 Estavayer"
  ],
  "essential_information": [
    "3.5 Zimmer",
    "102 m²",
    "1. Etage"
  ],
  "price": "2'100",
  "currency": "CHF",
  "date": "2026-01-03T09:45:58",
  "image_url": "https://assets.comparis.ch/image/upload/s--QIVXqSMG--/c_fill,f_auto,h_344,q_auto,w_458/v1/immobilien/Images/DataCollect/e40c17cc-310a-4537-2c69-bf9d24c178d9.jpg",
  "is_premium_listed": false,
  "comparis_points": null,
  "partner_logo_url": "https://assets.comparis.ch/image/upload/s--afxjsdkP--/f_auto,q_auto/v1/immobilien/Images/Static/logo_large_site_254.jpg",
  "partner_name": "Properstar",
  "contact_information": {
    "has_contact_form": true,
    "has_missing_address_contact_form": false,
    "has_missing_floor_plan_contact_form": true,
    "contact_site_id": 254,
    "contact_site_name": "Properstar",
    "contact_site_logo_url": null,
    "contact_form_type": 1,
    "default_contact_message": "Guten Tag\r\nIch interessiere mich für das Objekt 'Appartement rénové de 3.5 pièces, 102 m², vieille ville' in Estavayer. Bitte kontaktieren Sie mich. Freundliche Grüsse",
    "advertiser_information": null,
    "vendor_information": null,
    "visitation_contact_information": null,
    "is_vendor_contact_form": false,
    "online_application_url": null,
    "online_application_remarks": null
  },
  "price_development_direction": null,
  "price_value": 2100,
  "area_value": 102,
  "property_type_id": 1,
  "deal_type": 10,
  "use_internal_links": false,
  "show_comparis_rating": false,
  "member_logo_url": null,
  "show_default_personalization_segment": false,
  "price_type_text": "Mietpreis pro Monat",
  "from_url": "https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22ShowComparisPoints%22%3Anull%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22SwapProperty%22%3Anull%7D"
}
]
```

### Step-by-Step Implementation Guide

**1. Define Target Market:** Identify your research scope—specific cantons, cities, property types (apartments vs. houses), deal types (rental vs. sale), or price ranges. Perform test searches on Comparis.ch to verify filters return relevant results.

**2. Construct Search URLs:** Manually execute searches with desired filters on Comparis.ch. Copy the resulting URLs. For comprehensive coverage, create URLs for different locations, property types, and price segments. Note the `page` parameter for pagination planning.

**3. Configure Scraper Input:** Build JSON configuration with collected URLs. Set `max_items_per_url` to 20 for standard pages. Enable `ignore_url_failures` for robustness when processing many URLs. Consider enabling proxies for large-scale extraction.

**4. Execute Scraping Job:** Launch through Apify console and monitor real-time progress. Processing 10 search pages with 20 items each typically completes in 2-4 minutes, varying with platform load and page complexity.

**5. Validate Data Quality:** Preview results in dataset tab. Verify critical fields (price, address, property\_type) are populated. Check that property types and locations match your target criteria. Identify any systematic issues requiring URL adjustments.

**6. Export and Analyze:** Export in preferred format—JSON for application integration, CSV for spreadsheet analysis, Excel for business reporting. Clean data by filtering out non-active listings if only current inventory is needed.

**7. Handle Pagination Systematically:** For large datasets spanning multiple pages, either include all page URLs in one run (page=1, page=2, page=3...) or set `max_items_per_url` higher than single-page limits to automatically handle pagination.

**Error Handling:** If URLs consistently fail, verify they're search result pages, not individual property detail pages. Check that filter parameters in `requestobject` are valid—Comparis occasionally updates parameter structures. The activity log provides detailed error information.

**Optimization Tips:** For city-level analysis, create separate URLs for each major city rather than one national search. This produces cleaner datasets and enables more granular error handling. Schedule regular scraping to track market changes over time.

### Strategic Applications for Swiss Real Estate Intelligence

**Rental Market Analysis:** Track rental price evolution across Swiss cities and cantons. Identify emerging expensive vs. affordable neighborhoods. Analyze room count distribution and amenity availability (parking, balconies) by location. Calculate price per square meter benchmarks by region and property type.

**Investment Property Identification:** Filter properties by Comparis Points to identify undervalued opportunities. Track price development direction—properties with reduced prices may indicate motivated sellers. Analyze premium listed properties to understand where agencies invest marketing budgets, signaling competitive or desirable markets.

**Competitive Agency Intelligence:** Track which agencies (partner\_name) dominate specific regions or property types. Analyze their pricing strategies, inventory levels, and premium listing usage. Identify market gaps where fewer agencies operate—potential expansion opportunities.

**Market Inventory Monitoring:** Calculate property counts by type, location, and price range. Track how inventory levels change over time—increasing inventory signals buyer/renter markets, decreasing inventory indicates seller/landlord markets. Monitor time-on-market by tracking when listings first appear and when ad\_status changes.

**Affordability Studies:** Combine price data with Swiss wage statistics to calculate affordability indices by canton. Identify regions where rental costs exceed recommended income percentages. Support housing policy development with quantitative data.

**Amenity Value Analysis:** Compare properties with specific amenities (parking, balconies, pet-friendly) against those without to quantify price premiums. Understand what features drive highest value in different market segments.

**Partner Network Optimization:** Real estate platforms can analyze which partners (site\_id, partner\_name) contribute highest-quality listings (measured by Comparis Points, image quality, information completeness). Prioritize partnerships with top-performing sources.

**Geographic Price Mapping:** Use address data to create heat maps showing price distributions across cities and regions. Identify micro-markets with price anomalies. Support location-based property recommendations.

### Maximizing Data Value and Best Practices

**Schedule Regular Extractions:** Swiss real estate markets, especially rentals in major cities, change rapidly. Weekly scraping captures new listings and price adjustments. Store historical data to analyze seasonal patterns, long-term price trends, and market cycle phases.

**Segment by Canton and Language Region:** Switzerland's cantonal variations in regulations, taxes, and demographics create distinct sub-markets. Analyze separately: German-speaking (Zürich, Bern), French-speaking (Geneva, Lausanne), Italian-speaking (Ticino) regions for nuanced insights.

**Calculate Price Per Square Meter:** Use price\_value and area\_value to standardize comparisons across different property sizes. This metric reveals true value better than absolute prices and enables cross-property-type analysis.

**Track Comparis Points Distribution:** Analyze the distribution of Comparis Points across your target market. Properties scoring above 80 points represent excellent value; below 50 may indicate overpricing or quality issues. Use this for investment screening.

**Enrich With External Data:** Combine Comparis data with Swiss Federal Statistical Office data (population growth, income levels), public transport maps (proximity to stations), school ratings, and tax rates. Enhanced datasets support sophisticated investment models.

**Monitor Premium Listing ROI:** For agencies using the scraper competitively, track correlation between is\_premium\_listed status and time-to-rent/sale. Quantify whether premium placement justifies costs based on faster transaction times.

**Quality Assurance Checks:** Implement validation rules—prices shouldn't be zero, areas should be within reasonable ranges (10-500m² for apartments), addresses should contain valid postal codes. Flag anomalies for manual review before analysis.

**Respect Data Freshness:** Note the date field and prioritize recent listings. Properties listed over 90 days ago may have stale information or hidden issues preventing transactions. Implement aging filters in analysis.

**Build Comparable Property Databases:** Group properties by similar characteristics (location radius, size range, property type) to create comparable sets. This supports accurate market value assessments and investment property evaluation.

**Create Alert Systems:** Set up automated monitoring for properties meeting specific criteria (Comparis Points >85, specific locations, price reductions). Early identification of opportunities provides competitive advantage in fast-moving markets.

### Data Governance and Compliance

**Scraping Frequency Management:** Balance data freshness needs against platform load. For general market monitoring, weekly extractions suffice. For competitive analysis or hot markets, daily scraping may be necessary. Avoid excessive concurrent requests.

**Data Storage and Retention:** Implement structured storage with timestamps and source URLs. Maintain historical snapshots to enable longitudinal analysis. Consider data retention policies complying with Swiss data protection regulations.

**Privacy Considerations:** Contact information (phone numbers, emails) may constitute personal data under Swiss Federal Act on Data Protection (FADP). Implement appropriate security measures, access controls, and use data only for intended purposes. Avoid republishing personal contact details without consent.

**Terms of Service Compliance:** Review Comparis.ch terms of service regarding automated access. Use scraped data for analysis and internal purposes. Avoid creating competing platforms that directly replicate Comparis functionality.

**Data Accuracy Disclaimers:** Property information on comparison platforms may lag behind source updates. Cross-reference critical data points before making significant decisions. Implement verification processes for investment-grade analysis.

**Attribution Practices:** When presenting analysis based on Comparis data, acknowledge the source. Maintain partner\_name and site\_id fields to credit original listing sources in any public-facing applications or reports.

### Conclusion

The Comparis.ch Property Search Scraper transforms Switzerland's leading real estate comparison platform into actionable market intelligence. From rental affordability analysis to investment opportunity identification, this tool provides the comprehensive data foundation for informed real estate decisions. Whether you're optimizing agency operations, conducting cantonal market research, or building PropTech solutions, systematic Comparis data extraction delivers competitive advantage in Swiss real estate markets. Start extracting Swiss property insights today.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

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

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22ShowComparisPoints%22%3Anull%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22SwapProperty%22%3Anull%7D"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "urls": [
        "https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22ShowComparisPoints%22%3Anull%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22SwapProperty%22%3Anull%7D"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/comparis-property-search-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 = {
    "urls": ["https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22ShowComparisPoints%22%3Anull%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22SwapProperty%22%3Anull%7D"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/comparis-property-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.comparis.ch/immobilien/result/list?requestobject=%7B%22DealType%22%3A10%2C%22SiteId%22%3A0%2C%22RootPropertyTypes%22%3A%5B%5D%2C%22PropertyTypes%22%3A%5B%5D%2C%22RoomsFrom%22%3Anull%2C%22RoomsTo%22%3Anull%2C%22FloorSearchType%22%3A0%2C%22LivingSpaceFrom%22%3Anull%2C%22LivingSpaceTo%22%3Anull%2C%22PriceFrom%22%3Anull%2C%22PriceTo%22%3Anull%2C%22ComparisPointsMin%22%3A0%2C%22ShowComparisPoints%22%3Anull%2C%22AdAgeMax%22%3A0%2C%22AdAgeInHoursMax%22%3Anull%2C%22Keyword%22%3A%22%22%2C%22WithImagesOnly%22%3Anull%2C%22WithPointsOnly%22%3Anull%2C%22Radius%22%3Anull%2C%22MinAvailableDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22MinChangeDate%22%3A%221753-01-01T00%3A00%3A00%22%2C%22LocationSearchString%22%3Anull%2C%22Sort%22%3A3%2C%22HasBalcony%22%3Afalse%2C%22HasTerrace%22%3Afalse%2C%22HasFireplace%22%3Afalse%2C%22HasDishwasher%22%3Afalse%2C%22HasWashingMachine%22%3Afalse%2C%22HasLift%22%3Afalse%2C%22HasParking%22%3Afalse%2C%22PetsAllowed%22%3Afalse%2C%22MinergieCertified%22%3Afalse%2C%22WheelchairAccessible%22%3Afalse%2C%22LowerLeftLatitude%22%3Anull%2C%22LowerLeftLongitude%22%3Anull%2C%22UpperRightLatitude%22%3Anull%2C%22UpperRightLongitude%22%3Anull%2C%22SwapProperty%22%3Anull%7D"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call stealth_mode/comparis-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/comparis-property-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Comparis Property Search Scraper",
        "description": "Efficiently scrape property listings from Comparis.ch, Switzerland's leading real estate comparison platform. Extract comprehensive rental and sale data including prices, locations, property types, and market ratings. Perfect for real estate agencies, market analysts, & property investment research",
        "version": "0.0",
        "x-build-id": "GHS1oyPZiULFa2hlO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~comparis-property-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-comparis-property-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~comparis-property-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-comparis-property-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~comparis-property-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-comparis-property-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the property list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Select proxies to be used by your scraper."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
