# Sreality.cz Scraper - Czech Property Data (`parsebird/sreality-cz-scraper`) Actor

Scrape property listings from Sreality.cz, the largest Czech real estate portal. Search by keyword, location, price range, and offer type. Get prices, locations, POI distances, agency info, and images.

- **URL**: https://apify.com/parsebird/sreality-cz-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.59 / 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Sreality.cz Scraper

Sreality.cz Scraper extracts property listings from [Sreality.cz](https://www.sreality.cz/), the largest Czech real estate portal. It's a **Sreality.cz API alternative** for pulling structured listing data — prices, locations, POI distances, agency info, and images — without manually browsing the site.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, Czech location, price range, offer type, and property category, and get every listing's price, GPS coordinates, distances to nearby amenities, agency details, and image gallery.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

```
Use the Apify actor "parsebird/sreality-cz-scraper" (call it via the apify-client SDK, e.g. `ApifyClient(token).actor("parsebird/sreality-cz-scraper").call(run_input={...})`) to scrape property listings from Sreality.cz, the largest Czech real estate portal. Key inputs: startUrl (default "https://www.sreality.cz/doporucene", used as the source reference and as a fallback filter source), keyword (free text searched in listing descriptions), location (a Czech place name like "Brno" or "Praha", resolved to Sreality's own location automatically), sort (-date, price_asc, price_desc, price_m2_asc, or price_m2_desc), offer_type (1 for sale, 2 for rent), category_main (1 Flats, 2 Houses, 3 Land, 4 Commercial, 5 Other), price_from/price_to (CZK), results_wanted (default 20), and max_pages (default 10). Output is one JSON object per listing with estate_id, title, offer_type, category_main/category_sub, locality_text plus location_city/district/region/country/latitude/longitude, price_czk, price_czk_m2, price_summary, price_currency, agency_id, agency_slug, has_video, has_matterport, primary_image_url, image_urls, images_count, poi_*_distance_m fields (school, shop, bus, train, atm, and more), source_url, and scraped_at. Full API reference: https://apify.com/parsebird/sreality-cz-scraper/api. Get an API token at https://console.apify.com/account/integrations.
```

### What does Sreality.cz Scraper do?

Sreality.cz Scraper turns [Sreality.cz](https://www.sreality.cz/) listings into structured, ready-to-use data. It works two ways:

- 🎯 **Recommended listings** — leave every filter blank and it collects Sreality's own "Doporučené" (recommended) feed
- 🔍 **Filtered search** — set any combination of keyword, location, offer type, category, and price range to search like a real user would

Every listing includes GPS coordinates, distance in meters to the nearest **school, shop, bus stop, train station, ATM, restaurant, kindergarten, playground, post office, vet, and metro** (when Sreality publishes them), plus the listing agency's ID and page slug, video/Matterport availability, and the full image gallery.

Runs can be triggered on a **schedule**, called via the **Apify API**, or wired into **Zapier, Make, or n8n** integrations, so you can monitor new listings in a city or price band over time. Results export as **JSON, CSV, or Excel**.

### What data can you extract from Sreality.cz?

| Field | Description |
|-------|-------------|
| `estate_id`, `title` | Unique Sreality listing ID and headline |
| `offer_type`, `category_main`, `category_sub` | Sale/rental label and property category |
| `locality_text`, `location_city`/`district`/`region`/`country` | Full locality breakdown |
| `location_latitude`, `location_longitude` | GPS coordinates, when published |
| `price_czk`, `price_czk_m2`, `price_summary`, `price_currency` | Pricing in Czech koruna |
| `agency_id`, `agency_slug` | Listing agency identifier and page slug |
| `has_video`, `has_matterport` | Media availability flags |
| `primary_image_url`, `image_urls`, `images_count` | Listing image gallery |
| `poi_*_distance_m` | Distance in meters to nearby schools, shops, transit, and more |

See [Output example](#output-example) below for a full record.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| startUrl | string | No | `https://www.sreality.cz/doporucene` | Sreality page used as the source reference |
| keyword | string | No | — | Text to search in Sreality listing descriptions |
| location | string | No | — | A Czech location name, such as Brno or Praha |
| offer\_type | integer | No | — | 1 for sale, 2 for rent |
| category\_main | integer | No | — | Sreality main category ID (1 Flats, 2 Houses, 3 Land, 4 Commercial, 5 Other) |
| price\_from / price\_to | number | No | — | Price range, in CZK |
| sort | string | No | — | `-date`, `price_asc`, `price_desc`, `price_m2_asc`, or `price_m2_desc` |
| results\_wanted | integer | No | `20` | Maximum number of listings to save |
| max\_pages | integer | No | `10` | Maximum number of result pages to process |
| proxyConfiguration | object | No | — | Optional Apify Proxy configuration for blocked cloud egress |

### Output example

```json
{
  "estate_id": 3843384140,
  "title": "Prodej rodinného domu 153 m², pozemek 475 m²",
  "offer_type": "Prodej",
  "offer_type_id": 1,
  "category_main": "Domy",
  "category_sub": "Rodinný",
  "locality_text": "Lipová, Prostějov, Olomoucký kraj, Česká republika",
  "location_city": "Lipová",
  "location_district": "Prostějov",
  "location_region": "Olomoucký kraj",
  "location_country": "Česká republika",
  "location_latitude": 49.520441,
  "location_longitude": 16.86507,
  "price_czk": 7777250,
  "price_czk_m2": 50832,
  "price_currency": "Kč",
  "price_unit": "za nemovitost",
  "has_video": true,
  "has_matterport": false,
  "agency_id": 34573,
  "agency_slug": "ostrov-realit",
  "primary_image_url": "https://d18-a.sdn.cz/d_18/c_img_p9_A/kcHp2YdDtDgLT0unF8i3ga/98f6.jpeg",
  "images_count": 3,
  "poi_school_distance_m": 36,
  "source_url": "https://www.sreality.cz/doporucene",
  "scraped_at": "2026-09-19T06:45:00.000Z"
}
```

Download results as **JSON, CSV, or Excel** from the Apify Console, or pull them programmatically via the [dataset API](https://docs.apify.com/api/v2#/reference/datasets).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/sreality-cz-scraper").call(run_input={
    "keyword": "rodinny dum",
    "location": "Brno",
    "results_wanted": 50,
    "max_pages": 5,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price_czk"])
```

#### JavaScript

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

const client = new ApifyClient({ token: "<YOUR_API_TOKEN>" });
const run = await client.actor("parsebird/sreality-cz-scraper").call({
    keyword: "rodinny dum",
    location: "Brno",
    results_wanted: 50,
    max_pages: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- 🏡 Build a **property comparison dataset** for a city or price band
- 📈 Monitor a location for **new listings** on a schedule
- 🗺️ Map listings by **GPS coordinates** and proximity to schools or transit
- 🏢 Research **agency inventory** by tracking `agency_id`/`agency_slug` across listings
- 📊 Feed a BI dashboard or valuation model with structured Czech property data

### How it works

1. Sreality.cz Scraper reads Sreality's own public listings API — no login or key required.
2. When `location` is set, it first resolves the place name to Sreality's own location ID via the site's autocomplete API, then applies it as a filter.
3. With no filters set, it falls back to Sreality's own "Doporučené" (recommended) feed.
4. Results are paginated until `results_wanted` or `max_pages` is reached.
5. `price_m2_asc`/`price_m2_desc` are applied to the scraped batch, since Sreality's public API does not sort by price-per-m2 server-side — increase `max_pages` for a more representative sort.
6. Every listing is pushed to the dataset as soon as it's fetched, and billed via [pay-per-result](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) — you never pay for empty runs.

### How much does it cost to scrape Sreality.cz?

Sreality.cz Scraper uses **pay-per-result** pricing — you only pay for listings actually returned, never for compute time or failed runs.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `listing-scraped` (per listing) | $0.89 / 1,000 | $0.79 / 1,000 | $0.69 / 1,000 | $0.59 / 1,000 |

Scraping 1,000 listings on a Gold plan costs about **$0.59**. Apify's [monthly platform usage credits](https://apify.com/pricing) apply on top of your plan, so most light usage is covered without any extra charge.

### Input & output

Open the [Input tab](https://apify.com/parsebird/sreality-cz-scraper/input-schema) to see every field with examples. Every run's results are available as a dataset — export as JSON, CSV, or Excel, or read them with the [Apify API](https://docs.apify.com/api/v2) and [client libraries](https://docs.apify.com/api/client/python/) for Python and JavaScript.

### Is it legal to scrape Sreality.cz?

Scraping publicly available data — the kind shown on Sreality's public listing pages without logging in — is generally considered legal, including under rulings like *hiQ Labs v. LinkedIn*. That said, you're responsible for how you use the data: respect [Sreality's Terms of Service](https://www.sreality.cz/), and consult a lawyer if you plan to redistribute the data commercially. Read more in Apify's [guide to web scraping and the law](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

Looking for other real estate data sources? Check out [ParseBird's Apify Store profile](https://apify.com/parsebird) for more scrapers covering property listings, marketplace, and business data.

### FAQ

**Does this need a Sreality account or API key?**
No. Sreality.cz Scraper reads Sreality's own public listings API — no login or key required.

**Can I search in English?**
Location names work best in Czech (e.g. `Praha`, not `Prague`), since they're matched against Sreality's own place names. Keyword search matches whatever language the listing descriptions are written in (almost always Czech).

**Do I need to worry about Czech diacritics in my keyword or location?**
No — Sreality's search matches with or without diacritics (e.g. `dum` and `dům` return the same results).

**What's the difference between price\_asc/price\_desc and price\_m2\_asc/price\_m2\_desc?**
`price_asc`/`price_desc`/`-date` are sorted by Sreality itself across its full inventory. `price_m2_asc`/`price_m2_desc` are sorted locally over the batch this run scraped, since Sreality's public API doesn't support server-side price-per-m2 sorting — use a higher `max_pages` for a more representative result.

**Can I run this on a schedule?**
Yes — use [Apify's Scheduler](https://docs.apify.com/platform/schedules) to run daily or weekly and catch new listings matching your filters.

**Something looks wrong or missing — where do I report it?**
Open an issue on the Actor's Issues tab in Apify Console, or reach out via [Apify's support](https://apify.com/contact). Feedback on data accuracy is always welcome.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/sreality-cz-scraper/changelog.md

# Actor input Schema

## `keyword` (type: `string`):

Text to search for in Sreality listing descriptions, e.g. rodinny dum.

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

A Czech location name, such as Brno or Praha. Resolved to Sreality's own location automatically.

## `offer_type` (type: `integer`):

1 for sale, 2 for rent.

## `category_main` (type: `integer`):

Sreality's main property category: 1 Flats, 2 Houses, 3 Land, 4 Commercial, 5 Other.

## `price_from` (type: `number`):

Minimum price, in CZK (or CZK/month for rentals).

## `price_to` (type: `number`):

Maximum price, in CZK (or CZK/month for rentals).

## `sort` (type: `string`):

Sreality's own sort order. price\_m2\_asc/price\_m2\_desc are applied to the scraped batch, since Sreality's public API does not sort by price-per-m2 server-side.

## `startUrl` (type: `string`):

A Sreality.cz page used as the source reference, and as the fallback when no filters above are set. Recommended listings by default.

## `results_wanted` (type: `integer`):

Maximum number of listings to save.

## `max_pages` (type: `integer`):

Maximum number of result pages to process.

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

Optional Apify Proxy configuration, useful if Sreality blocks cloud egress IPs.

## Actor input object example

```json
{
  "startUrl": "https://www.sreality.cz/doporucene",
  "results_wanted": 20,
  "max_pages": 10,
  "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 = {
    "keyword": "",
    "location": "",
    "startUrl": "https://www.sreality.cz/doporucene",
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "keyword": "",
    "location": "",
    "startUrl": "https://www.sreality.cz/doporucene",
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "keyword": "",
  "location": "",
  "startUrl": "https://www.sreality.cz/doporucene",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/sreality-cz-scraper --silent --output-dataset

```

## MCP server setup

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