# Sreality.cz Real Estate Scraper (`alwaysprimedev/sreality-cz-scraper`) Actor

Scrape Czech property listings (sale, rent, auction) from sreality.cz with prices, areas, addresses, photos, energy class and seller contacts.

- **URL**: https://apify.com/alwaysprimedev/sreality-cz-scraper.md
- **Developed by:** [Always Prime](https://apify.com/alwaysprimedev) (community)
- **Categories:** Automation, Lead generation, Real estate
- **Stats:** 5 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 ads

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?

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

## 🏠 Sreality.cz Real Estate Scraper

> ⚡️ Structured Czech real-estate listings in seconds — sale, rent, auction. Clean JSON, CSV or Excel.

![Apify](https://img.shields.io/badge/Apify-actor-brightgreen) ![Python](https://img.shields.io/badge/Python-3.11-blue) ![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)

Pull every public listing from [sreality.cz](https://www.sreality.cz) — the №1 real-estate portal in Czechia — and get it back as a normalized dataset. Filter by region, property type, deal type, price range; or paste a raw search URL and let the scraper crawl it for you.

### ✨ Why this scraper

- 🚀 **Fast.** Direct JSON source — no headless browser, no DOM parsing.
- 📦 **Complete.** 30+ fields per listing: price, area, rooms, GPS, full image set, agent contacts, energy class, modification date.
- 🎯 **Filterable.** Region, property type, deal type, price range, sort order — all from a clean input form.
- 🔁 **Incremental-friendly.** `since` parameter skips listings that haven't changed.
- 💰 **Pay only for what you get.** Pay-per-result pricing — every record in the dataset is a record you wanted.

### 🚀 Quick start

1. **Try for free** — click the green Start button.
2. **Pick filters** — choose deal type (sale / rent / auction), property type, regions and an optional price range.
3. **Click Start** — the actor walks the search results and detail pages for you.
4. **Download** — open the dataset and export as JSON, CSV or Excel.

### 🎛 Input

| Field | Description |
| --- | --- |
| `searchType` | Sale (Prodej), Rent (Pronájem), or Auction (Aukce). |
| `propertyTypes` | Apartments, Houses, Land, Commercial, Other. Pick one or more. |
| `regions` | Czech regions (kraj) by slug: `praha`, `stredocesky`, `jihomoravsky`, etc. |
| `minPrice` / `maxPrice` | CZK price range. |
| `sortBy` | Newest first, price ascending/descending, or largest area first. |
| `maxItems` | Cap on output size. `0` = no limit. |
| `scrapeDetails` | Full-fat mode (default) or cheap index-only mode. |
| `since` | ISO timestamp — skip listings older than this. |
| `concurrency` | Parallel detail requests. Default 5, max 25. |
| `startUrls` | Advanced: paste raw search API URLs to override filters. |

### 📦 Sample output

```json
{
  "url": "https://www.sreality.cz/detail/prodej/byt/praha-kamyk-u-kamyku/2812150604",
  "id": "2812150604",
  "scraped_at": "2026-05-05T00:45:18Z",
  "name": "Prodej bytu 4+kk 116 m²",
  "searchType": "sale",
  "propertyType": "apartments",
  "price": 17800000,
  "priceCurrency": "CZK",
  "priceUnit": "total",
  "priceText": "17 800 000",
  "usableArea": 116,
  "floorArea": null,
  "landArea": null,
  "rooms": "4+kk",
  "floor": 9,
  "buildingType": "Cihlová",
  "condition": "Velmi dobrý",
  "ownership": "Osobní",
  "energyRating": "C",
  "hasElevator": true,
  "hasParking": true,
  "hasBalcony": false,
  "hasTerrace": true,
  "hasGarden": false,
  "imageCount": 23,
  "images": [
    "https://d18-a.sdn.cz/.../ec90.jpeg?fl=res,1280,960,3|shr,,20|jpg,90"
  ],
  "gps": { "lat": 50.017332896, "lon": 14.435376212 },
  "address": "U Kamýku, Praha 4 - Kamýk",
  "locality": {
    "region": null,
    "district": "Kamýk",
    "municipality": "Praha 4",
    "street": "U Kamýku"
  },
  "agentName": "Fröhlich Michal",
  "agentPhone": "+420 296399006",
  "agentEmail": "info@mmreality.cz",
  "agentWebsite": "https://www.mmreality.cz/",
  "modifiedAt": "2026-04-21T00:00:00Z"
}
```

### 💼 Use cases

| Who | What for |
| --- | --- |
| 🏘 Real-estate investors | Comp-set analysis, yield calculations, market timing. |
| 🤝 Brokers and agencies | Inventory tracking, competitor pricing, lead generation. |
| 🤖 PropTech and ML teams | Training data for valuation models, market-trend dashboards. |
| 📈 Market analysts | Time-series of price-per-m² by district, neighborhood-level reports. |
| 🏛 Researchers | Housing affordability studies, geographic supply/demand. |

### 💡 Tips & tricks

- 🕒 **Daily incremental updates** — schedule the actor with a `since` value of `now - 24h` to grab only listings that changed in the last day.
- 💸 **Index-only mode** — set `scrapeDetails: false` to walk just the search pages. You lose detail-only fields (condition, building type, agent contacts, modification date) but pay for ~10× fewer requests, ideal for diff runs.
- 🎯 **Multi-region runs** — list every region in a single run; the actor iterates them in turn so you do not need to set up one job per kraj.
- 🔗 **Custom queries** — open sreality.cz in your browser, build your perfect search using the website filters, copy the request URL from your browser's network tab and paste it into `startUrls`.

### ❓ FAQ

**Does it require an account?**  No. The scraper runs anonymously.

**Are images full resolution?**  Yes — image URLs are returned at 1280×960 by default. Edit the `res,1280,960` segment in the URL to request other sizes.

**What about historical listings?**  This actor scrapes the *current* live inventory. For history, schedule daily runs and store results — incremental mode (`since`) keeps that cheap.

**Why are some prices `null`?**  Sreality marks "price on request" listings with a sentinel that we normalize to `null`. The full price text is preserved in `priceText` when present.

**Why is `modifiedAt` sometimes missing?**  The modification date lives only in the detail-page payload. If the listing has not been updated since publication, the field can be absent — we surface `null` in that case.

### ⚖️ Legal

This actor scrapes publicly available information only. Use of the resulting data is subject to sreality.cz Terms of Use, Czech and EU law (including GDPR). You are the data controller of any output you persist; you are responsible for compliance with applicable regulations on your end. The maintainer of this actor is not responsible for downstream uses.

### 📜 Changelog

- **0.1** — Initial release. Sale / rent / auction. 30+ fields per listing. Pay-per-result pricing.

# Actor input Schema

## `searchType` (type: `string`):

Whether to scrape properties for sale (Prodej), for rent (Pronájem), or in auctions (Aukce). Maps to sreality.cz's main category.

## `propertyTypes` (type: `array`):

Which property categories to include. You can pick more than one — the actor will iterate them in turn.

## `regions` (type: `array`):

List of Czech administrative regions (kraj) to scrape. Use slug names: praha, stredocesky, jihocesky, plzensky, karlovarsky, ustecky, liberecky, kralovehradecky, pardubicky, vysocina, jihomoravsky, olomoucky, zlinsky, moravskoslezsky.

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

Lower bound on property price in Czech crowns. Leave empty to disable. For rent listings the bound applies to monthly price.

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

Upper bound on property price in Czech crowns. Leave empty to disable.

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

Order in which the listings are walked. Newest first is best for incremental runs; price ascending is best for bargain hunting.

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

Maximum number of listings to scrape across the whole run. Set to 0 to disable the limit and scrape every match (use with care on large regions).

## `scrapeDetails` (type: `boolean`):

When enabled (default), each listing's detail endpoint is fetched to populate building type, condition, ownership, energy rating, agent contacts and floor. Disable for a cheap index-only mode that uses search-page data only.

## `since` (type: `string`):

Optional ISO 8601 timestamp (e.g. 2026-04-01T00:00:00Z). Listings whose last modification date is older are skipped. Requires Scrape detail pages to be enabled — modification date is only available on detail records.

## `concurrency` (type: `integer`):

Number of detail requests to run in parallel. Default 5 is polite and reliable; increase for faster runs at the cost of higher chance of rate-limiting (cap 25).

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

Advanced override. Provide raw sreality.cz API URLs (https://www.sreality.cz/api/cs/v2/estates?...) instead of using the searchType/propertyTypes/regions filters. Useful when you've crafted a complex query in the website UI and copied the network call.

## Actor input object example

```json
{
  "searchType": "sale",
  "propertyTypes": [
    "apartments"
  ],
  "regions": [
    "praha"
  ],
  "minPrice": 5000000,
  "maxPrice": 25000000,
  "sortBy": "newest",
  "maxItems": 50,
  "scrapeDetails": true,
  "concurrency": 5
}
```

# Actor output Schema

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

No description

## `listingsCsv` (type: `string`):

No description

## `listingsXlsx` (type: `string`):

No description

## `consoleView` (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 = {
    "searchType": "sale",
    "propertyTypes": [
        "apartments"
    ],
    "regions": [
        "praha"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("alwaysprimedev/sreality-cz-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 = {
    "searchType": "sale",
    "propertyTypes": ["apartments"],
    "regions": ["praha"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("alwaysprimedev/sreality-cz-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 '{
  "searchType": "sale",
  "propertyTypes": [
    "apartments"
  ],
  "regions": [
    "praha"
  ],
  "maxItems": 50
}' |
apify call alwaysprimedev/sreality-cz-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alwaysprimedev/sreality-cz-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/H6QIBiDkbvrJyRTRB/builds/0zWixI2KRWAc6m5lz/openapi.json
