# Sreality Scraper · Czech Republic Real Estate Listings (`memo23/sreality-scraper`) Actor

Scrape Sreality.cz — Czech Republic's #1 property portal. Any sale or rent search URL returns price, Kč/m², disposition, address, GPS, photos and agency. Optional deep mode adds the full description, all parameters and the seller's name, phone and email. JSON or CSV.

- **URL**: https://apify.com/memo23/sreality-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Agents, AI
- **Stats:** 28 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Scraper

Scrape property listings from **Sreality.cz** — the Czech Republic's largest real-estate portal. Paste any sale or rent search URL and get clean, structured rows: price, price per m², disposition, full address, GPS coordinates, photos, agency and more. One row per property. Pure HTTP, no browser.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-sreality.png)

### Why use this scraper

- **Everything on the listing page** — price, Kč/m², disposition, full street address, GPS coordinates, photos and agency all come from one fetch; no slow per-property crawling.
- **Sale *and* rent, every category** — flats, houses, land and commercial, on any `prodej` (sale) or `pronájem` (rent) search, with all your on-site filters honoured and paginated automatically.
- **Price per m² out of the box** — `pricePerSqmCzk` is returned on every row, no extra calculation.
- **Clean, flat output** — one row per property; nested address/params flattened for CSV by default.
- **Pure HTTP, no browser** — fast and cheap; no Playwright, no headless Chrome.
- **Optional deep detail** — turn on `fetchDetails` to add the full description, every parameter (floor, condition, energy rating, year built…), the **seller's name, phone and email**, Matterport & video URLs, nearby points of interest and price-drop history.

### What it does

Give it one or more Sreality **search** URLs. For each, it reads the live results and emits one dataset row per property with all the fields below. Searches paginate automatically (`?strana=N`) until you hit `Maximum items`.

### Supported inputs

| Input | Example |
|---|---|
| Sale flats | `sreality.cz/hledani/prodej/byty/praha` |
| Rent flats | `sreality.cz/hledani/pronajem/byty/brno` |
| Houses / land / commercial | swap `byty` for `domy` / `pozemky` / `komercni` |
| Filtered search | run any search on sreality.cz, copy the URL from the address bar |

### Use cases

- **Real-estate market & price research** across Czech cities and regions.
- **Lead generation** — agency names, listing URLs, and (with `fetchDetails`) seller name, phone and email.
- **Investment analysis** — Kč/m², price distribution, price-drop tracking, new-build vs resale.
- **Aggregation & portals** — pull fresh Czech listings into your own product.

### How it works

1. You paste Sreality search URLs.
2. The actor reads each search page's embedded property data and paginates through results.
3. Each property is normalised into one flat row and pushed to the dataset (optionally enriched from its detail page).

### Input configuration

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Sreality **search** URLs (auto-paginated). |
| `maxItems` | integer | Hard cap on properties collected. Default 10000. |
| `fetchDetails` | boolean | Opt-in: open each property's detail page for the **full description**, **all parameters** (floor, condition, energy rating, year built…), the **seller's name, phone & email**, **Matterport & video URLs**, **nearby POIs** and **price-drop history**. +1 request/property, billed per `additional-data` event. Default off. |
| `flatten` | boolean | Flatten nested objects/arrays into CSV columns (default on). |
| `enrichEmails` | boolean | Opt-in agency contact-email enrichment (billed per email found). |
| `maxConcurrency` | integer | Parallel row processing. Default 8. |
| `proxy` | object | Proxy config. Defaults to Apify Residential. |

### Output sample

```json
{
  "portal": "sreality",
  "id": "1514729548",
  "url": "https://www.sreality.cz/detail/prodej/byt/1+kk/praha-vysocany-kolma/1514729548",
  "transactionType": "sale",
  "category": "flat",
  "disposition": "1+kk",
  "name": "Prodej bytu 1+kk 16 m²",
  "priceCzk": 3990000,
  "pricePerSqmCzk": 249375,
  "surface": 16,
  "address": { "street": "Kolmá", "cityPart": "Vysočany", "district": "Praha 9", "city": "Praha", "region": "Hlavní město Praha" },
  "latitude": 50.10354,
  "longitude": 14.51582,
  "photoCount": 9,
  "hasVideo": true,
  "agency": "next-reality-style"
}
```

### Key output fields

| Field | Description |
|---|---|
| `id` / `url` | Sreality property id + detail URL |
| `transactionType` / `transactionTypeCz` | sale / rent (+ original Prodej / Pronájem) |
| `category` / `categoryCz` | flat / house / land / commercial (+ Czech label) |
| `disposition` | 2+kk, 3+1 … |
| `priceCzk` / `pricePerSqmCzk` | price + price per m² |
| `surface` | floor area in m² |
| `address.*` | street, streetNumber, cityPart, district, city, region, zip |
| `latitude` / `longitude` / `geoHash` | GPS coordinates |
| `photos` / `photoCount` | image URLs + count |
| `hasVideo` / `hasMatterport` / `isExclusive` | listing flags |
| `agency` / `agencyId` / `agencyLogo` | listing agency |
| `description` | full listing text *(with `fetchDetails`)* |
| `params` | all decoded parameters — condition, building type, floor, energy rating, year… *(with `fetchDetails`)* |
| `sellerName` / `sellerPhone` / `sellerEmail` | seller contact *(with `fetchDetails`)* |
| `matterportUrl` / `videoUrls` / `nearbyPois` / `oldPriceCzk` | virtual tour, videos, nearby points of interest, price-drop *(with `fetchDetails`)* |

### FAQ

**Sale and rent both?** Yes — pass a `prodej` (sale) or `pronájem` (rent) search URL; `transactionType` is set accordingly.

**Which property types?** Flats (`byty`), houses (`domy`), land (`pozemky`) and commercial (`komercni`) — any `/hledani/` search URL.

**Do filters work?** Yes — any filter you set on sreality.cz is encoded in the URL and honoured.

**How do I get the seller's phone/email?** Turn on `fetchDetails` — it adds the seller's name, phone and email (plus the full description and every parameter) from each property's detail page.

**Do I need a proxy?** Apify Residential (the default) is recommended for larger runs.

### Support

Found an issue or want a field added? Open an issue on the actor's Issues tab and we'll take a look.

### Additional services

Need agency contact emails? Turn on `enrichEmails` to append a best-effort contact email + website per agency (billed only when an email is found).

### Explore more scrapers

Check the publisher's profile for more real-estate and directory scrapers (Idealista, Fotocasa, Redfin, Zillow, Realtor, Immobilienscout24 and more).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/sreality-scraper`).

**Purpose:** Scrape Sreality.cz sale/rent property listings from any `/hledani/` search URL — one flat row per property with price, Kč/m², disposition, address and GPS straight from the search page, no per-property crawling.

**Minimal input:**

```json
{
  "startUrls": ["https://www.sreality.cz/hledani/prodej/byty/praha"],
  "maxItems": 25
}
```

**Output:** one row per property — portal, id, url, transactionType, category, disposition, name, priceCzk, pricePerSqmCzk, surface, address {street, streetNumber, cityPart, district, city, region, zip}, latitude, longitude, geoHash, photos, photoCount, hasVideo, hasMatterport, isExclusive, agency, agencyId, agencyLogo; with `fetchDetails`: description, params, sellerName, sellerPhone, sellerEmail, matterportUrl, videoUrls, nearbyPois, oldPriceCzk.

**Behaviors an agent should know:**

- Only `/hledani/` **search** URLs are supported; each is auto-paginated (`?strana=N`) until `maxItems` is hit. Always set `maxItems` — the default is 10000 (~20 listings/page).
- `fetchDetails` (default off) is required for the full description, all params, and seller name/phone/email; it adds one request per property, billed per `additional-data` event.
- `enrichEmails` (default off) appends best-effort agency contactEmail + contactWebsite, billed only when an email is found.
- `flatten` (default on) flattens nested objects/arrays into CSV columns; disable for full nested JSON.
- Seller contact fields never appear without `fetchDetails`; pure HTTP, no browser.

### ⚠️ Disclaimer

This actor collects only publicly available property-listing data for legitimate research, lead-generation and aggregation use. Respect Sreality's terms of service and applicable laws (including data-protection rules) in your jurisdiction. You are responsible for how you use the scraped data.

### SEO Keywords

sreality scraper, sreality api, sreality.cz scraper, czech real estate scraper, czech property data, prodej bytu scraper, pronájem scraper, property listings czech republic, real estate data prague, real estate data brno, kč/m2 price data, property coordinates scraper, czech real estate lead generation, sreality export

# Actor input Schema

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

Full Sreality.cz /hledani/ search URLs. Each is paginated automatically (?strana=N) until `Maximum items` is reached.

## `flatten` (type: `boolean`):

When enabled (default), nested objects/arrays (e.g. `address`, `photos`, `params`) are flattened into CSV-friendly columns. Disable to keep the full nested JSON.

## `fetchDetails` (type: `boolean`):

If enabled, opens each property's detail page to add the **full description**, **all parameters** (floor, condition, energy rating, year built, ownership…), the **seller's name, phone and email**, the **Matterport & video URLs**, the **price-drop history** and the **nearby points of interest**. Adds one extra request per property and charges an `additional-data` event each time. Leave off for the fast/cheap search-only output.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each listing agency by discovering the agency's website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns. Best-effort, billed per email found; never charged for misses.

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

Hard cap on the number of properties collected. Each search page returns ~20 listings and paginates automatically; use this cap to control billing.

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

Maximum number of rows processed in parallel (mainly relevant when detail-fetch or agency-email enrichment is on). 6-12 is the sweet spot.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

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

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.sreality.cz/hledani/prodej/byty/praha",
    "https://www.sreality.cz/hledani/pronajem/byty/brno"
  ],
  "flatten": true,
  "fetchDetails": false,
  "enrichEmails": false,
  "maxItems": 10000,
  "maxConcurrency": 8,
  "maxRequestRetries": 5
}
```

# 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": [
        "https://www.sreality.cz/hledani/prodej/byty/praha",
        "https://www.sreality.cz/hledani/pronajem/byty/brno"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/sreality-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": [
        "https://www.sreality.cz/hledani/prodej/byty/praha",
        "https://www.sreality.cz/hledani/pronajem/byty/brno",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/sreality-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 '{
  "startUrls": [
    "https://www.sreality.cz/hledani/prodej/byty/praha",
    "https://www.sreality.cz/hledani/pronajem/byty/brno"
  ]
}' |
apify call memo23/sreality-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/voJr59DfGCJigfewO/builds/H9o1GgpU12dNkZY7G/openapi.json
