# Flatfox Property Scraper (`parsebird/flatfox-scraper`) Actor

Scrape Flatfox.ch property listings for rent or sale: price, rooms, living space, address, coordinates, photos, agency, and dates. Search by city, postal code, filters, or paste Flatfox search URLs. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/flatfox-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 property 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### Flatfox Property Scraper

Flatfox Property Scraper extracts **structured real estate data from [Flatfox.ch](https://flatfox.ch)** — Switzerland's agency-direct rental and sales portal. Search any Swiss **city, region, or postal code**, filter by price, rooms, and living space, or paste Flatfox **search-result URLs**, and get clean listing data ready for analysis, monitoring, or lead generation.

<table><tr>
<td style="border-left:4px solid #00A99D;padding:12px 16px;font-weight:600">
Turn a Flatfox search into an analysis-ready dataset — net and gross rent, selling price, rooms, living space, floor, build year, feature tags, exact coordinates, canton, all photos, and agency name, address and logo — for rentals and sales across the whole of Switzerland.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/flatfox-scraper — scrapes property listings from flatfox.ch (Swiss real estate, rent + sale). Input: {"startUrls": [{"url": "https://flatfox.ch/en/search/?offer_type=RENT&north=47.43&south=47.32&east=8.63&west=8.45"}], "offerType": "RENT", "location": "Zurich", "objectCategories": ["APARTMENT","HOUSE"], "priceMin": null, "priceMax": 2500, "roomsMin": "2.5", "roomsMax": "4.5", "spaceMin": null, "spaceMax": null, "sortBy": "newest", "maxResults": 100, "maxResultsPerUrl": 0, "ignoreUrlFailures": true}. Provide startUrls (Flatfox search URLs) OR the build-a-search fields. Leave location empty to search all of Switzerland. objectCategories: APARTMENT, HOUSE, SECONDARY, SHARED, INDUSTRY, PARK. sortBy: newest | price_asc | price_desc | rooms_asc | rooms_desc | space_desc. Run via ApifyClient("YOUR_TOKEN").actor("parsebird/flatfox-scraper").call(run_input=input). Output per listing: id, reference, title, description, objectCategory, objectType, offerType, price, priceUnit, priceDisplayType, rentNet, rentCharges, rentGross, sellingPrice, livingSpace, surfaceProperty, surfaceUsable, numberOfRooms, floor, yearBuilt, yearRenovated, isFurnished, isTemporary, attributes, street, zipcode, city, publicAddress, latitude, longitude, state, country, movingDate, movingDateType, publishedAt, createdAt, images, coverImage, agencyName, agencyAddress, agencyLogo, url. Get an API token at https://console.apify.com/account#/integrations. Full API spec: https://apify.com/parsebird/flatfox-scraper/api
```

### What does Flatfox Property Scraper do?

Flatfox Property Scraper is a **Flatfox scraper and Swiss real estate data extractor**. Flatfox lists apartments, houses, shared flats, commercial space, and parking directly from landlords and agencies across Switzerland, and this actor reads that public search data into a structured dataset.

🔍 **Two ways to search** — build a search from an origin city or postal code plus filters, or paste one or more Flatfox **search-result URLs** and the scraper mirrors the filters and map area from each URL.

🏙️ **Every Swiss location** — search "Zurich", "Geneva", "Lausanne", a canton, a postal code like "8005", or leave the location empty to scan **all of Switzerland**.

🗺️ **Beats the map limit** — Flatfox returns a limited number of pins per map area. The scraper automatically subdivides dense regions so large cities return far more than a single search would.

💰 **Full pricing breakdown** — display price, `rentNet`, `rentCharges`, `rentGross`, and `sellingPrice` for sales, plus the price unit and display type.

📐 **Property detail** — rooms (including half rooms like 3.5), living space, property and usable surface, floor, build year, renovation year, furnished and temporary flags, and a list of feature `attributes` (balcony, elevator, parking, pets allowed, and more).

📍 **Precise location** — street, postal code, city, full public address, canton, country, and exact latitude/longitude.

🏢 **Agency and media** — agency name, postal address, and logo, plus every full-resolution photo and the cover image.

#### Why scrape Flatfox?

- Build a **Swiss rental market dataset** — price per m², rooms, and availability by city or canton
- Track **new listings** on a route or in a neighbourhood and get notified when they appear
- Generate **agency leads** — every listing carries the managing agency's name and address
- Feed a **property portal, CRM, or relocation tool** with structured Flatfox listings
- Run **price and supply analysis** for rent or for sale across regions

### What data can you extract with Flatfox Property Scraper?

| Field | Type | Description |
|-------|------|-------------|
| id | number | Unique Flatfox listing identifier |
| reference | string | null | Agency reference code |
| title | string | Listing headline |
| description | string | null | Full listing description text |
| objectCategory | string | APARTMENT, HOUSE, SECONDARY, SHARED, INDUSTRY, or PARK |
| objectType | string | More specific type (APARTMENT, OFFICE, GARAGE\_SLOT, …) |
| offerType | string | RENT or SALE |
| price | number | null | Display price in CHF (monthly for rentals) |
| priceUnit / priceDisplayType | string | Price unit (e.g. `monthly`, `sell`) and how it is shown |
| rentNet / rentCharges / rentGross | number | null | Net rent, utility charges, and gross rent in CHF |
| sellingPrice | number | null | Selling price in CHF for for-sale listings |
| livingSpace / surfaceProperty / surfaceUsable | number | null | Areas in square metres |
| numberOfRooms | number | null | Number of rooms (e.g. 3.5) |
| floor / yearBuilt / yearRenovated | number | null | Floor and construction dates |
| isFurnished / isTemporary | boolean | Furnished and temporary-lease flags |
| attributes | string\[] | Feature tags (balcony, lift, parkingspace, pets\_allowed, …) |
| street / zipcode / city / publicAddress | string | null | Address parts and the full display address |
| latitude / longitude | number | null | Exact coordinates |
| state / country | string | null | Canton code and country code (CH) |
| movingDate / movingDateType | string | null | Available-from date and how it is expressed |
| publishedAt / createdAt | string | Publication and creation timestamps |
| images | string\[] | Full-resolution photo URLs |
| coverImage | string | null | Cover photo URL |
| agencyName / agencyAddress / agencyLogo | string | null | Listing agency details |
| url | string | Direct Flatfox listing URL |
| scrapedAt | string | ISO 8601 timestamp of the run |

### How to use Flatfox Property Scraper

1. Open [Flatfox Property Scraper](https://apify.com/parsebird/flatfox-scraper) and click **Try for free**.
2. Either paste **Search URLs** from [flatfox.ch](https://flatfox.ch) (the scraper reads the filters from each URL), or leave URLs empty and use the **Build a Search** fields.
3. For a built search: set **Offer type** (rent or sale), a **Location** (city or postal code, or empty for all of Switzerland), and any **Property categories**.
4. Add filters: **min/max price**, **min/max rooms** (half rooms like `2.5` are allowed), **min/max living space**.
5. Choose a **Sort by** order and set **Max results** (and optionally **Max results per URL**).
6. Click **Start**, then export the dataset as **JSON, CSV, Excel, or HTML**, or pull it via API.

#### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| startUrls | array | No | — | Flatfox search-result URLs. Filters and map area are read from each URL; Build-a-Search filters below are layered on where the URL omits them |
| offerType | string | No | `RENT` | `RENT` or `SALE` (built search only) |
| location | string | No | — | City, region, or postal code. Empty = all of Switzerland |
| objectCategories | array | No | all | `APARTMENT`, `HOUSE`, `SECONDARY`, `SHARED`, `INDUSTRY`, `PARK` |
| priceMin / priceMax | integer | No | — | Price bounds in CHF (monthly rent for rentals) |
| roomsMin / roomsMax | string | No | — | Room bounds, half rooms allowed (e.g. `2.5`) |
| spaceMin / spaceMax | integer | No | — | Living-space bounds in m² |
| sortBy | string | No | `newest` | `newest`, `price_asc`, `price_desc`, `rooms_asc`, `rooms_desc`, `space_desc` |
| maxResults | integer | No | 100 | Total listings across all searches. `0` = as many as available |
| maxResultsPerUrl | integer | No | 0 | Per-search / per-URL cap. `0` = no per-URL limit |
| ignoreUrlFailures | boolean | No | `true` | Skip a failing search and continue, instead of stopping the run |
| proxyConfiguration | object | No | Apify Proxy | Datacenter proxy is enough for Flatfox |

### Output example

```json
{
  "id": 421337,
  "reference": "ZH-4021",
  "title": "Bright 3.5-room apartment near the lake",
  "description": "Renovated apartment with balcony, modern kitchen, and lake views...",
  "objectCategory": "APARTMENT",
  "objectType": "APARTMENT",
  "offerType": "RENT",
  "price": 2450,
  "priceUnit": "monthly",
  "priceDisplayType": "TOTAL",
  "rentNet": 2200,
  "rentCharges": 250,
  "rentGross": 2450,
  "sellingPrice": null,
  "livingSpace": 86,
  "surfaceProperty": null,
  "surfaceUsable": null,
  "numberOfRooms": 3.5,
  "floor": 2,
  "yearBuilt": 1998,
  "yearRenovated": 2021,
  "isFurnished": false,
  "isTemporary": false,
  "attributes": ["balcony", "elevator", "pets_allowed"],
  "street": "Seestrasse 14",
  "zipcode": "8002",
  "city": "Zürich",
  "publicAddress": "Seestrasse 14, 8002 Zürich",
  "latitude": 47.3567,
  "longitude": 8.5361,
  "state": null,
  "country": "CH",
  "movingDate": "2026-08-01",
  "movingDateType": "DATE",
  "publishedAt": "2026-06-10T09:22:00Z",
  "createdAt": "2026-06-10T09:20:00Z",
  "images": ["https://flatfox.ch/media/listing/421337/01.jpg"],
  "coverImage": "https://flatfox.ch/media/listing/421337/cover.jpg",
  "agencyName": "Lakeview Immobilien AG",
  "agencyAddress": "Bahnhofstrasse 5, 8001 Zürich, CH",
  "agencyLogo": "https://flatfox.ch/media/agency/logo.png",
  "url": "https://flatfox.ch/en/flat/bright-3-5-room-apartment/421337/"
}
```

Download results in **JSON, CSV, Excel, or HTML** from the Apify Console or via the API.

### Use cases

- 📊 **Rental market research** — build a price-per-m² and supply dataset by city, canton, or category
- 🔔 **New-listing monitoring** — schedule the actor and alert on fresh listings in a target area
- 🧲 **Agency lead lists** — pull the managing agency name and address from every listing
- 🏠 **Relocation and search tools** — power an apartment-finder with structured Flatfox data
- 🤖 **Real estate bots and dashboards** — feed a chatbot or BI dashboard with live listings
- 💹 **Investment analysis** — compare asking prices and yields for for-sale properties across regions

### How it works

1. **Search spec** — each Search URL is parsed for its filters and map bounds; a built search uses your fields, and a location is geocoded to a bounding box.
2. **Map pins** — Flatfox's public search returns lightweight listing pins for a map area, capped per request.
3. **Subdivision** — when a map area hits the cap, it is split into quadrants and re-queried, so dense cities return far more than one search.
4. **Filter** — price and category are applied at the source; room and living-space bounds are checked against each listing's real values.
5. **Detail** — every remaining listing is fetched in full (photos, agency, attributes, description) and mapped to a clean record.
6. **Cap and output** — results are truncated to `maxResults` (and `maxResultsPerUrl`) and pushed to the dataset.

The actor uses lightweight `httpx` requests and stays under 512 MB — no browser required.

### How much does it cost to scrape Flatfox?

Flatfox Property Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event). One event is charged per listing pushed to the dataset. Platform compute is included.

| Plan | Price per listing | Price per 1,000 listings |
|------|-------------------|--------------------------|
| Free | $0.00099 | **$0.99** |
| Bronze | $0.00089 | **$0.89** |
| Silver | $0.00089 | **$0.89** |
| Gold | $0.00079 | **$0.79** |

**Example:** a run that returns 500 listings costs $0.50 on the Free plan. Listings dropped by filters or the result caps are never charged.

You can run Flatfox Property Scraper with the [free monthly usage credits](https://apify.com/pricing) on every Apify plan.

### Integrations and API access

Flatfox Property Scraper works with the full [Apify platform](https://docs.apify.com/platform):

- **API access** — run it and fetch results via the [REST API](https://docs.apify.com/api/v2) or the Python and JavaScript clients
- **Scheduling** — set up recurring runs with the [Apify Scheduler](https://docs.apify.com/platform/schedules) to track new listings
- **Webhooks** — trigger downstream work when a run finishes
- **Integrations** — push data to [Google Sheets](https://apify.com/apify/google-sheets), [Slack](https://docs.apify.com/platform/integrations/slack), [Zapier](https://docs.apify.com/platform/integrations/zapier), [Make](https://docs.apify.com/platform/integrations/make), Airtable, and more

#### Python example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "location": "Geneva",
    "offerType": "RENT",
    "objectCategories": ["APARTMENT"],
    "priceMax": 3000,
    "roomsMin": "3",
    "sortBy": "price_asc",
    "maxResults": 300,
}

run = client.actor("parsebird/flatfox-scraper").call(run_input=run_input)

for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["price"], listing["numberOfRooms"], listing["city"], listing["url"])
```

#### JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const input = {
    startUrls: [
        { url: 'https://flatfox.ch/en/search/?offer_type=SALE&north=47.43&south=47.32&east=8.63&west=8.45' },
    ],
    maxResults: 500,
    maxResultsPerUrl: 250,
};

const run = await client.actor('parsebird/flatfox-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((l) => console.log(`${l.sellingPrice ?? l.price}\t${l.numberOfRooms}\t${l.publicAddress}`));
```

### Pricing

| Event | Price per event (Free) | Price per 1,000 |
|-------|------------------------|-----------------|
| listing-scraped | $0.00099 | **$0.99** |

One event per listing in the dataset. Bronze, Silver, and Gold plans pay less — see the cost section above.

### FAQ

**Where does the data come from?**
Flatfox's public property search and listing pages — the same data anyone browsing [flatfox.ch](https://flatfox.ch) sees. No login and no Flatfox account is required.

**How do I search a specific area?**
Enter a city or postal code in **Location**, or paste a Flatfox search URL that already has the map area and filters set. Leave **Location** empty to search all of Switzerland.

**Why did my search return fewer results than `maxResults`?**
Flatfox limits how many listings a single map area returns. The scraper subdivides busy areas automatically, but a very narrow filter (for example a rare room count in a small town) may still have fewer matching listings than your cap.

**Are half rooms supported in the room filter?**
Yes. Enter values like `2.5` or `4.5` in `roomsMin` / `roomsMax`.

**Does it cover both rentals and sales?**
Yes. Set `offerType` to `RENT` or `SALE` for a built search, or use a Flatfox URL with `offer_type=RENT` or `offer_type=SALE`.

**Can I scrape several cities or searches in one run?**
Yes. Add multiple Search URLs, or run the actor on a [schedule](https://docs.apify.com/platform/schedules) with different locations. Use `maxResultsPerUrl` to balance results across them.

**Can I schedule recurring runs?**
Yes — use [Apify scheduling](https://docs.apify.com/platform/schedules) and webhooks to keep a listings feed fresh.

**Found a bug or need a field added?**
Open the **Issues** tab on the Actor page.

### Is it legal to scrape Flatfox?

Flatfox Property Scraper collects publicly available information: property listings and agency contact details that Flatfox publishes for anyone to browse. It does not log in, submit applications, or access personal data.

Scraping public data is generally legal, as reaffirmed by the [US Ninth Circuit in hiQ Labs v. LinkedIn](https://www.eff.org/deeplinks/2022/04/scraping-public-websites-still-isnt-crime-court-reaffirms). Make sure your use complies with applicable law (including Swiss and EU data-protection rules) and with Flatfox's Terms of Use. This actor is independent and not affiliated with or endorsed by Flatfox. See Apify's guide to [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Homegate.ch Swiss Real Estate Scraper](https://apify.com/parsebird/homegate-ch-scraper) — listings, prices, and details from Homegate.ch
- [Comparis.ch Scraper](https://apify.com/parsebird/comparis-ch-scraper) — Swiss property and price-comparison data
- [Zefix.ch Scraper](https://apify.com/parsebird/zefix-ch-scraper) — Swiss commercial register company data
- [Airbnb Scraper & API](https://apify.com/parsebird/airbnb-scraper) — short-term rental listings, prices, and availability

# Actor input Schema

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

Flatfox search-result URLs (e.g. https://flatfox.ch/en/search/?offer\_type=RENT\&north=47.43\&south=47.32\&east=8.63\&west=8.45). The scraper reads the filters and map area straight from each URL. Leave empty to build a search below.

## `offerType` (type: `string`):

Search properties for rent or for sale. Used only when no Search URLs are provided.

## `location` (type: `string`):

City, region, or postal code to search (for example "Zurich", "Geneva", or "8005"). Leave empty to search all of Switzerland.

## `objectCategories` (type: `array`):

Limit results to these categories. Leave empty for all.

## `priceMin` (type: `integer`):

Only include listings at or above this price. For rentals this is the monthly rent.

## `priceMax` (type: `integer`):

Only include listings at or below this price.

## `roomsMin` (type: `string`):

Minimum number of rooms. Half rooms are allowed (for example 2.5).

## `roomsMax` (type: `string`):

Maximum number of rooms (for example 4.5).

## `spaceMin` (type: `integer`):

Minimum living space in square meters.

## `spaceMax` (type: `integer`):

Maximum living space in square meters.

## `sortBy` (type: `string`):

Result order.

## `maxResults` (type: `integer`):

Total number of listings to collect across all searches and URLs. Set to 0 to collect as many as available.

## `maxResultsPerUrl` (type: `integer`):

Maximum listings to collect from each individual search or URL. Set to 0 for no per-URL limit.

## `ignoreUrlFailures` (type: `boolean`):

When enabled, the scraper skips any search or URL that fails and continues with the rest. When disabled, the run stops on the first failure.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests to Flatfox.

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

Apify Proxy routing. Datacenter proxy is enough for Flatfox.

## Actor input object example

```json
{
  "startUrls": [],
  "offerType": "RENT",
  "location": "Zurich",
  "objectCategories": [],
  "sortBy": "newest",
  "maxResults": 50,
  "maxResultsPerUrl": 0,
  "ignoreUrlFailures": true,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [],
    "location": "Zurich",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/flatfox-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 = {
    "startUrls": [],
    "location": "Zurich",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/flatfox-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 '{
  "startUrls": [],
  "location": "Zurich",
  "maxResults": 50
}' |
apify call parsebird/flatfox-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/flatfox-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/23eOXOTXMTTVtKaFk/builds/BjFruIz73dyht0NC5/openapi.json
