# Sreality.cz Scraper: Real Estate Listings & Price Monitor (`tsutseisoftware/sreality-scraper`) Actor

Scrape Sreality.cz real estate: flats, houses, land, rentals and auctions by URL, location, region, district or ID. Price, price per m², GPS, agency, 100+ parameters, distances to transport. Monitoring of new, changed and removed listings. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/sreality-scraper.md
- **Developed by:** [Tomáš Buchta](https://apify.com/tsutseisoftware) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 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: Real Estate Listings & Price Monitor

Scrape real estate listings from **Sreality.cz**, the largest Czech property portal (over 100 000 listings): **flats, houses, land, commercial property, garages**, for **sale, rent, auction or shares**. Start from a **search URL** copied from the website (all its filters are kept), from **locations in words** ("Brno", "Praha 6", "Smíchov") with an optional **radius**, from whole **regions** or **districts**, or from **listing URLs and IDs**. A search of any size works: the website's limit of 10 000 listings per search is **split automatically**, so you can download a whole category, or all of Sreality, without missing a listing.

For each listing you get the title, type, layout, **price, price per m², price unit** (per month for rentals), usable and plot area, the full **address with GPS**, the agency or **private seller** flag, photos, video and 3D tour flags, and the **distances to public transport, metro, train, supermarket, school, kindergarten, doctor** and more. With **Add listing details** you also get the description, **listed and updated date, number of views**, floor, condition, building type, ownership, furnishing, **energy class**, balcony, terrace, cellar, garage, parking, elevator, heating and utilities, the **original price before a discount**, auction date and deposit, and the **agency's name, IČO and website**.

Built for **monitoring**: schedule it and get, and pay for, only **new listings and price changes**, plus the listings that **were removed** (checked on Sreality.cz: deleted, or no longer matching your search) and the ones that **came back**.

### Why use this Sreality.cz scraper?

- 🔎 **More ways to search than any other Sreality scraper:** website URLs with all their filters, API URLs, locations in words with a radius, regions, districts, listing IDs, and 50+ input fields: transaction, property types, layouts, price, area, plot area, floor, listing age, condition, building type, ownership, furnishing, energy class, 11 "must have" features (balcony, terrace, garage, elevator, 3D tour…) and full-text search.
- 📍 **Location filters no one else has:** the **maximum distance to public transport, metro, train, supermarket, school, kindergarten, doctor, playground or restaurant**, from the website's own data. "2+kk in Prague within 300 m of the metro" is one input.
- 💰 **Investor filters:** min/max **price per m²**, only discounted, only with a price, agencies only or **private sellers only**, only or except given **agencies**, exclude keywords ("podíl", "rezervováno").
- 🗺️ **Whole categories and the whole country:** searches over 10 000 listings are split by layout, region (plus the listings abroad) and district, then read completely. Measured on Apify: all 23 685 flats for sale in Czechia in **100 seconds**.
- 🔔 **Real monitoring:** new and changed listings with `previousPrice`, `priceChange` and `priceChangePercent`, filters for **price changes only** and **minimum price drop**, removed listings with a **reason** (`deleted` or `noLongerMatches`, each checked on the website) and reappeared listings.
- ⚡ **Fast (faster than the speeds other Sreality scrapers publish):** the website's JSON API, 200 listings per request, pages downloaded in parallel, 8 Czech residential IPs with kept-alive connections, no browser. **1 000 listings with full details in ~5 minutes** (~200 a minute), or **~3 minutes in fast mode** (~340 a minute). The prefilled input finishes in seconds.
- 💸 **Priced below the most used Sreality scraper**, with and without details, and no per-run fee to speak of: see the pricing below.
- 🧾 **Clean output:** flat camelCase fields that work in CSV and Excel, numbers as numbers, ISO dates, `null` for missing values, stable `id` for joining runs.
- 🔒 **No personal data:** brokers' names, phones, e-mails and photos are never returned; phone numbers and e-mails are removed from descriptions.

### What data can you get?

Share of listings with a value, measured on 23 582 flats for sale (all of Sreality, listing data) and on 150 listing pages with details (flats for sale in Prague, houses for sale, flats for rent), 2026-10-19. Fields marked *details* need **Add listing details**.

| Field | Example | Filled |
|---|---|---|
| Title, type, subtype / layout | Prodej bytu 3+1 72 m², sale, flat, 3+1 | 100 % |
| Price, price unit, price per m² | 9 499 000 CZK, za nemovitost, 131 931 CZK/m² | 96 % (the rest: price on request, `priceOnRequest: true`) |
| Usable area, plot area | 72 m²; houses 90 m², plot 932 m² | 100 % (plot: houses and land) |
| Region, district, city, city part | Hlavní město Praha, Praha 10, Praha, Záběhlice | 100 % |
| Street, house number | Švehlova, 2887/26 | 79 %, 51 % (as precise as the listing) |
| GPS, location precision | 50.05567, 14.51457, address | 100 % |
| Agency ID / private seller | 71342 / `isPrivateSeller` | 95 % agencies, 5 % private sellers |
| Photos (URL, count), video, 3D tour | 43 photos | 100 % photos |
| Distance to public transport, school, supermarket | 120 m, 420 m, 300 m | 88 %, 88 %, 79 % |
| Distance to metro | 640 m | 26 % (Prague) |
| Description *(details)* | full text, contacts removed | 100 % |
| Listed, updated, views *(details)* | 2026-08-24, 2026-10-19, 6 547 | 100 % |
| Condition, building type *(details)* | Velmi dobrý, Panelová | 100 % |
| Energy class *(details)* | G | 85 % |
| Floor, ownership *(details)* | 8 of 13, Osobní | 67 % (flats) |
| Furnished, elevator *(details)* | Částečně, yes | 56 %, 50 % |
| Agency name, IČO, website *(details)* | Häusl\&Home Reality, 21841071 | 98 % |
| Original price before a discount *(details)* | 9 990 000 CZK (−4.9 %) | 18 % (discounted listings) |
| ZIP code *(details)* | 10600 | 91 % |
| Auction date, place, kind, deposit *(details)* | 2026-12-08T11:00:00, exdrazby.cz, Exekutorská dražba, 40 000 CZK | auctions |

See the **Output** tab for all 121 fields.

### How to scrape Sreality.cz

1. Open Sreality.cz, search as usual (e.g. flats for sale in Prague, 2+kk, up to 8 million), and paste the URL from the address bar into **Sreality.cz search or listing URLs**. Or leave the URL out and fill in **Transaction**, **Property types**, **Subtypes / layouts** and **Locations**, **Regions** or **Districts**.
2. Optionally add **Website filters** (price, area, floor, condition…) and **Filters** (price per m², distance to the metro, seller…), set **Max listings** and turn on **Add listing details**.
3. Click **Start** and download the results as JSON, CSV or Excel, or use the API.

**Tip:** the filters of the input are added to the URL's filters; for ranges (price, area) the narrower one wins.

### Use cases

Copy an input into the **JSON** tab of the input and adjust it.

**2+kk and 3+kk for sale in Prague up to 9 million, within 500 m of the metro, newest first:**

```json
{
  "transactionType": "sale",
  "propertyTypes": ["flat"],
  "subtypes": ["2+kk", "3+kk"],
  "regions": ["10"],
  "maxPrice": 9000000,
  "maxDistanceToMetro": 500,
  "maxItems": 500
}
```

**Daily watchdog: new rentals in Brno and its surroundings (10 km) and price drops, with details:**

```json
{
  "transactionType": "rent",
  "propertyTypes": ["flat", "house"],
  "locations": ["Brno"],
  "radiusKm": 10,
  "includeDetails": true,
  "onlyNewOrChanged": true,
  "includeRemovedListings": true,
  "monitoringKey": "brno-rent",
  "maxItems": 0
}
```

**Investor screening: flats in the Central Bohemian region under 70 000 CZK per m², private sellers only:**

```json
{
  "transactionType": "sale",
  "propertyTypes": ["flat"],
  "regions": ["11"],
  "maxPricePerSqm": 70000,
  "sellerType": "private",
  "includeDetails": true,
  "maxItems": 0
}
```

**Family houses with a garden near a school and a kindergarten, energy class A–C:**

```json
{
  "transactionType": "sale",
  "propertyTypes": ["house"],
  "subtypes": ["Rodinný"],
  "districts": ["Praha-západ", "Praha-východ"],
  "features": ["garden"],
  "energyClasses": ["A", "B", "C"],
  "maxDistanceToSchool": 1000,
  "maxDistanceToKindergarten": 1000,
  "includeDetails": true,
  "maxItems": 0
}
```

**Upcoming property auctions in the whole country with dates and deposits:**

```json
{
  "transactionType": "auction",
  "propertyTypes": ["flat", "house", "land", "commercial", "other"],
  "includeDetails": true,
  "maxItems": 0
}
```

**Market data: all flats for rent in Czechia (for price maps and statistics):**

```json
{
  "transactionType": "rent",
  "propertyTypes": ["flat"],
  "maxItems": 0
}
```

**Your own URL, or a list of listings:**

```json
{
  "startUrls": [
    { "url": "https://www.sreality.cz/hledani/pronajem/byty/brno?velikost=2%2Bkk,3%2Bkk&cena-do=25000" },
    { "url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zabehlice-svehlova/352436300" }
  ],
  "estateIds": ["2179338316"],
  "includeDetails": true
}
```

**An agency's listings, or the market without the big agencies:** run once, take `agencyId` from the results, then use **Only these agencies** or **Exclude agencies**.

#### Website filters (applied by Sreality.cz)

Price, usable area, plot area, floor, listed in the last N days, building condition, building type, ownership, furnishing, energy class, the "must have" features and full-text search in descriptions are sent to the website's search, so only matching listings are downloaded.

#### Filters (you don't pay for filtered-out listings)

Seller (agencies or private), price per m², distances to public transport, metro, train, supermarket, school, kindergarten, doctor, playground and restaurant, only discounted, only with a price, GPS or photos, exclude keywords, only or except given agencies. They use the listing data, so they cost no extra requests (except "Exclude keywords" in descriptions, which needs details).

#### Monitoring mode explained

Turn on **Monitoring: only new or changed listings** and schedule the actor (e.g. every morning). The first run returns everything and remembers it under the **Monitoring key**. Every next run returns only listings that are new (`changeType: "new"`) or whose price or title changed (`"updated"`, with `previousPrice`, `priceChange`, `priceChangePercent`). With **include removed listings**, listings that are no longer in your search are checked on Sreality.cz and returned once as `"removed"` with `removedReason` `"deleted"` (gone from the website) or `"noLongerMatches"` (still listed, but e.g. its price moved out of your range); a removed listing that comes back is `"reappeared"`. Use one monitoring key per watched search.

#### Fast mode (optional, small extra charge)

Normal speed: 8 requests at a time and 240 per minute, spread over 8 Czech IP addresses (about 30 per minute each). Fast mode: 16 at a time and 480 per minute, automatically back to the normal speed when the website slows down or rejects a request. It matters for listing details (one request per listing); listing data alone is fast either way (200 listings per request).

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

You pay per saved listing, and a little more for the listings saved with their details. Platform usage is included. Filtered-out and unchanged listings (in monitoring mode) are free.

| Plan | Per 1 000 listings | + with details (Add listing details) | + Fast mode |
|---|---|---|---|
| FREE | **$0.95** | +$0.75 | +$0.01 |
| BRONZE | **$0.93** | +$0.73 | +$0.01 |
| SILVER | **$0.90** | +$0.70 | +$0.01 |
| GOLD and higher | **$0.85** | +$0.65 | +$0.01 |

So 1 000 listings cost $0.95, or $1.70 with all the details (FREE plan). A removed-listing row in monitoring mode is a row like any other (without details). There is also a tiny start fee of $0.00005 per run.

Typical runs (measured on Apify with the default settings, 2026-10-19):

| Scenario | Requests | Time | Price (FREE plan) |
|---|---|---|---|
| 20 listings from a search URL (the prefilled input) | 2 | a few seconds | $0.02 |
| 1 000 listings | ~6 | ~10–20 s | $0.95 |
| 1 000 listings with details | ~1 006 | ~5 min (fast mode ~3 min) | $1.70 |
| All 23 685 flats for sale in Czechia | ~125 | 100 s | $22.50 |
| Daily monitoring of a search with 2 000 listings, ~50 new or changed | ~11 | ~10 s | ~$0.05 |

### Input example

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

### Output example

```json
{
  "id": "sreality:352436300",
  "estateId": 352436300,
  "source": "sreality.cz",
  "url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zabehlice-svehlova/352436300",
  "name": "Prodej bytu 3+1 72 m²",
  "transactionType": "sale",
  "propertyType": "flat",
  "subtype": "3+1",
  "price": 9499000,
  "priceCurrency": "CZK",
  "priceUnit": "za nemovitost",
  "priceTotal": 9499000,
  "pricePerSqm": 131931,
  "priceOnRequest": false,
  "originalPrice": 9990000,
  "discountPercent": 4.9,
  "usableArea": 72,
  "region": "Hlavní město Praha",
  "district": "Praha 10",
  "city": "Praha",
  "cityPart": "Záběhlice",
  "street": "Švehlova",
  "houseNumber": "2887/26",
  "zip": "10600",
  "latitude": 50.05567,
  "longitude": 14.5145686,
  "locationPrecision": "address",
  "agencyId": 71342,
  "agencyName": "Häusl&Home Reality",
  "agencyIco": "21841071",
  "agencyWebsite": "https://hauslahome.cz",
  "isPrivateSeller": false,
  "imageUrl": "https://d18-a.sdn.cz/d_18/c_img_qE_D/nPYADvcUkmDj2BMDyZHlDyXO/b226.jpeg?fl=res,1200,1200,1|shr,,20|jpg,80",
  "imageCount": 43,
  "hasVideo": true,
  "hasVirtualTour": false,
  "distanceToPublicTransport": 120,
  "distanceToShop": 300,
  "distanceToSchool": 420,
  "description": "Nabízím k prodeji prostorný a velmi dobře dispozičně řešený byt 3+1 o užitné ploše 72 m²…",
  "listedAt": "2026-08-24",
  "updatedAt": "2026-10-19",
  "views": 6547,
  "floor": 8,
  "floors": 13,
  "condition": "Velmi dobrý",
  "buildingType": "Panelová",
  "ownership": "Osobní",
  "furnished": "Částečně",
  "elevator": true,
  "loggia": true,
  "loggiaArea": 3,
  "cellar": true,
  "cellarArea": 2,
  "reconstructionYear": 2015,
  "detailScraped": true,
  "scrapedAt": "2026-10-19T13:30:00Z"
}
```

(Shortened; every row has all fields, missing values are `null`.)

### Limitations

- **The website's limit:** Sreality.cz returns at most 10 000 listings per search. Bigger searches are split by layout, region (plus listings abroad) and district and read completely; only a single layout in a single district or town with more than 10 000 listings would be cut (it doesn't happen today). Results of a split search come part by part, each part in your sort order.
- **Area** without details comes from the title (it is the area the website shows); with details from the listing's parameters.
- **Address precision** is what the listing gives (`locationPrecision`): some listings have the exact address, others only the street or the town.
- **Distances** are the website's own (in metres, to the nearest place of each kind); `null` means there is none nearby.
- **Contacts:** brokers' names, phones, e-mails and photos are never returned, and phone numbers and e-mails are removed from descriptions. Names written in a description stay there.
- **Photos** are returned as URLs; they are copyrighted, so check the rights before you republish them.
- **Price changes** in monitoring mode compare the price with the previous run of the same monitoring key; `originalPrice` (with details) is the website's own "before discount" price.
- **Proxy:** Sreality.cz rejects requests from Apify's servers without a proxy, so a Czech residential Apify Proxy is on by default (included in the price). A datacenter proxy works too, but is several times slower.
- If the site rejects a request, it is asked once more after 30 seconds from the same IP address and session (never from another IP). If it rejects a few requests in a row even so, the run stops and says so. Listings whose page couldn't be read are returned with the search data (`detailScraped: false`).

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://www.sreality.cz/hledani/prodej/byty/praha"}], "maxItems": 20}`, or `{"locations": ["Brno"], "transactionType": "rent", "maxItems": 50}`, or `{"estateIds": ["352436300"]}`.
- One row = one listing = one charge (+ the details event for rows with `detailScraped: true`, + the fast-mode event when fast mode is on).
- `maxItems` counts saved listings (0 = no limit), `maxItemsPerSearch` limits each URL, location and search.
- Prices are in CZK; `priceUnit` says whether it is the whole property or per month. `transactionType` is `sale`, `rent`, `auction` or `share`; `propertyType` is `flat`, `house`, `land`, `commercial` or `other`.
- Regions are given by their Sreality IDs (`10` Praha, `11` Středočeský, `14` Jihomoravský…, see the input); districts by name.
- Monitoring state is kept per `monitoringKey` between runs of the same user.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("tsutseisoftware/sreality-scraper").call(run_input={
    "transactionType": "rent",
    "propertyTypes": ["flat"],
    "locations": ["Praha 6"],
    "maxPrice": 30000,
    "maxItems": 100,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["name"], listing["price"], listing["cityPart"], listing["url"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('tsutseisoftware/sreality-scraper').call({
    startUrls: [{ url: 'https://www.sreality.cz/hledani/prodej/domy/brno-venkov' }],
    includeDetails: true,
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((l) => `${l.name}: ${l.price} CZK (${l.pricePerSqm} CZK/m²)`));
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/tsutseisoftware~sreality-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"estateIds": ["352436300"], "includeDetails": true}'
```

You can also connect the actor to Make, Zapier, n8n, Google Sheets, Slack or webhooks and schedule it in Apify Console.

### Troubleshooting

| Status message | What to do |
|---|---|
| `Skipping unsupported URL` | Use a Sreality.cz search page (`/hledani/…`), an API search URL or a listing URL (`/detail/…`). |
| `Ignored URL parameters …` (log) | Tracking parameters (utm\_…) are removed; the search is the same. |
| `Location not found` | Type the place as the website's search box suggests it (a town, a city part, a district). |
| `Unknown subtype / district / region …` | Use one of the values listed in the message. |
| `no listings: …` | The search is empty (with these filters). |
| `not found: …` | The listing ID doesn't exist (anymore). |
| `… large searches were read in parts` | Normal for searches over 10 000 listings. |
| `Sreality.cz is rejecting requests` | Keep Apify Proxy on in **Proxy configuration** (the default); try again later. |
| `stopped at your maximum cost per run` | Raise the maximum cost per run in the run options. |

### FAQ

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

The actor collects publicly available listing data that anyone sees on the website without logging in. It reads the same data the website itself loads, does not log in, makes at most 240 requests per minute by default, spread over several IP addresses (480 in fast mode, with automatic slow-down) and never solves captchas or other challenges. It returns no personal data of brokers or private sellers (no names, phones, e-mails or photos) and removes phone numbers and e-mails from descriptions. How you use the data is your responsibility: use it for analysis, monitoring and market research, and don't republish the listings, texts or photos as your own. If unsure, consult a lawyer. Objections and data protection requests: the **Issues** tab of this actor.

#### Do I need a proxy?

Yes, but you don't have to do anything: a Czech residential Apify Proxy is on by default and is included in the price. Sreality.cz rejects Apify's servers without a proxy; a datacenter proxy works, but answers are several times slower.

#### How do I get all listings of a category or of the whole country?

Set **Max listings** to 0 and choose only the transaction and the property types (no location). The actor splits the search below the website's limit of 10 000 per search and reads it completely.

#### Why are some prices empty?

The listing has its price on request ("Cena na vyžádání"); `priceOnRequest` is `true`. Use **Only with a price** to skip them.

#### What does "noLongerMatches" mean?

In monitoring mode, a listing that is not in your search anymore is checked on Sreality.cz. If it still exists (e.g. its price changed out of your range, or it was moved to another category), it is `noLongerMatches`; if it is gone, `deleted`.

#### Can I get the broker's phone or e-mail?

No. The actor never returns personal contacts. You get the agency's name, IČO and website with **Add listing details**.

#### Can I use it through the API?

Yes. See the Python, JavaScript and cURL examples above, or the **API** tab.

#### Something doesn't work

Open an issue in the **Issues** tab with the link to the run.

This actor is not affiliated with Sreality.cz or Seznam.cz. It is also known as a Sreality API, Sreality.cz scraper, Czech real estate scraper or "hlídač realit Sreality" (hlídač nových inzerátů a cen nemovitostí).

# Actor input Schema

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

Search pages from Sreality.cz (set the filters on the website and paste the URL, e.g. https://www.sreality.cz/hledani/prodej/byty/praha?velikost=2%2Bkk), API search URLs (…/api/v1/estates/search?…) or listings (…/detail/…/352436300). All the website's filters in the URL are kept. The filters below are added on top.

## `transactionType` (type: `string`):

For the search built from the fields below (locations, regions, districts; or the whole country when no URL, location, region, district or ID is given).

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

For the search built from these fields (default: flats).

## `subtypes` (type: `array`):

Layouts or kinds as the website names them: flats 1+kk, 1+1, 2+kk, 2+1, 3+kk, 3+1, 4+kk, 4+1, 5+kk, 5+1, 6 a více, Atypický, Pokoj; houses Rodinný, Vila, Chata, Chalupa, Na klíč, Zemědělská usedlost, Vícegenerační dům, Památka/jiné; land Bydlení, Komerční, Pole, Lesy, Louky, Zahrady, Rybníky, Sady/vinice, Ostatní; commercial Kanceláře, Sklady, Výroba, Obchodní prostory, Ubytování, Restaurace, Zemědělský, Činžovní dům, Ordinace, Apartmány, Ostatní; other Garáž, Garážové stání, Vinný sklep, Půdní prostor, Mobilheim, Ostatní.

## `locations` (type: `array`):

Towns, city parts, streets or districts in words (e.g. "Brno", "Praha 6", "Smíchov", "Říčany"), looked up like the website's search box. Each location is its own search. Up to 20.

## `radiusKm` (type: `integer`):

Also listings up to this distance from each location (towns, city parts, streets). 0 = only the location itself.

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

Whole regions, searched together.

## `districts` (type: `array`):

Districts by name, searched together: e.g. "Brno-město", "Praha-západ", "Praha 6", "Kladno".

## `estateIds` (type: `array`):

Sreality listing IDs (the number at the end of a listing URL, e.g. 352436300). Each listing is read with its details. Up to 2000 per run.

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

Maximum number of listings saved (and charged) in total. 0 = no limit (a whole search, even over the website's 10 000 per search: it is split automatically).

## `maxItemsPerSearch` (type: `integer`):

Limit for each URL, location and search separately. 0 = no limit.

## `includeDetails` (type: `boolean`):

Read each listing's page too: description, listed and updated date, views, all parameters (floor, condition, ownership, energy class, balcony…), original price before a discount, the agency's name, IČO and website. One extra request per listing; no extra charge.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters. 0 = full description.

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

Order of the results in each search.

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

Website filter (also applied to URLs; the narrower range wins).

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

Website filter. For rentals the monthly rent.

## `minArea` (type: `integer`):

Website filter.

## `maxArea` (type: `integer`):

Website filter.

## `minPlotArea` (type: `integer`):

Website filter (houses and land).

## `maxPlotArea` (type: `integer`):

Website filter (houses and land).

## `minFloor` (type: `integer`):

Website filter (0 = ground floor).

## `maxFloor` (type: `integer`):

Website filter.

## `maxAgeDays` (type: `integer`):

Website filter: only listings published in this many days (e.g. 1, 7, 30). Empty = any age.

## `conditions` (type: `array`):

Website filter.

## `buildingTypes` (type: `array`):

Website filter.

## `ownership` (type: `array`):

Website filter.

## `furnished` (type: `array`):

Website filter.

## `energyClasses` (type: `array`):

Website filter (PENB).

## `features` (type: `array`):

Website filter: all of them.

## `descriptionContains` (type: `string`):

Website full-text search in titles and descriptions (e.g. "sauna", "výhled").

## `sellerType` (type: `string`):

Agencies only or private sellers only.

## `minPricePerSqm` (type: `integer`):

Only listings with at least this price per m².

## `maxPricePerSqm` (type: `integer`):

Only listings with at most this price per m² (finds bargains).

## `maxDistanceToPublicTransport` (type: `integer`):

Bus or tram stop within this distance.

## `maxDistanceToMetro` (type: `integer`):

Metro station within this distance (Praha).

## `maxDistanceToTrain` (type: `integer`):

Train station within this distance.

## `maxDistanceToShop` (type: `integer`):

Supermarket within this distance.

## `maxDistanceToSchool` (type: `integer`):

Primary school within this distance.

## `maxDistanceToKindergarten` (type: `integer`):

Kindergarten within this distance.

## `maxDistanceToDoctor` (type: `integer`):

General practitioner within this distance.

## `maxDistanceToPlayground` (type: `integer`):

Playground within this distance.

## `maxDistanceToRestaurant` (type: `integer`):

Restaurant or pub within this distance.

## `onlyDiscounted` (type: `boolean`):

Only listings marked as discounted (or with an original price).

## `onlyWithPrice` (type: `boolean`):

Skip listings with the price on request.

## `onlyWithGps` (type: `boolean`):

Skip listings without coordinates.

## `onlyWithImages` (type: `boolean`):

Skip listings without photos.

## `excludeKeywords` (type: `array`):

Skip listings whose title (or description, with details) contains any of these words, e.g. "podíl", "rezervováno".

## `agencyIds` (type: `array`):

Agency IDs (agencyId in the results) or URLs of agency pages on Sreality.cz.

## `excludeAgencyIds` (type: `array`):

Agency IDs (agencyId in the results) or URLs of agency pages on Sreality.cz.

## `onlyNewOrChanged` (type: `boolean`):

Return only listings that are new or whose price or title changed since the previous run with the same monitoring key. Unchanged listings are not saved or charged. Schedule the actor to get a watchdog.

## `monitoringKey` (type: `string`):

Name of the remembered state; use a different key for each watched search.

## `onlyPriceChanges` (type: `boolean`):

Of the changed listings, only those whose price changed (new listings are still returned).

## `minPriceDropPercent` (type: `integer`):

Only listings whose price dropped at least this much since the previous run.

## `includeRemovedListings` (type: `boolean`):

Also return listings that left the search since the previous run, each checked on Sreality.cz: removedReason "deleted" (gone from the website) or "noLongerMatches" (still listed, but no longer in your search). Listings that come back are marked "reappeared".

## `fastMode` (type: `boolean`):

About 2× faster (16 requests at a time, 480 per minute) for a small extra charge per listing. Back to the normal speed when the website slows down.

## `maxRequestsPerMinute` (type: `integer`):

Normal speed: 8 at a time, 240 per minute by default.

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

Czech residential proxy (the default, included in the price) is the fastest: Sreality.cz rejects Apify servers without a proxy, and datacenter proxies work but are several times slower.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.sreality.cz/hledani/prodej/byty/praha"
    }
  ],
  "transactionType": "sale",
  "subtypes": [],
  "maxItems": 20,
  "includeDetails": false,
  "sortBy": "newest",
  "sellerType": "any",
  "onlyDiscounted": false,
  "onlyWithPrice": false,
  "onlyWithGps": false,
  "onlyWithImages": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedListings": false,
  "fastMode": false,
  "maxRequestsPerMinute": 240,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  }
}
```

# Actor output Schema

## `listings` (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": [
        {
            "url": "https://www.sreality.cz/hledani/prodej/byty/praha"
        }
    ],
    "subtypes": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/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": [{ "url": "https://www.sreality.cz/hledani/prodej/byty/praha" }],
    "subtypes": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CZ",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tsutseisoftware/sreality-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": [
    {
      "url": "https://www.sreality.cz/hledani/prodej/byty/praha"
    }
  ],
  "subtypes": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  }
}' |
apify call tsutseisoftware/sreality-scraper --silent --output-dataset

```

## MCP server setup

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