# Sreality Scraper - Czech Property Listings & Prices (`sian.agency/sreality-property-scraper`) Actor

Scrape Sreality.cz, the Czech Republic's biggest property portal. Prices in CZK and per m2, disposition, usable area, floor, panel or brick, energy label, GPS and agency.

- **URL**: https://apify.com/sian.agency/sreality-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 property searches

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

## Sreality Scraper — Czech Property Listings & Prices 🏠

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Otodom Property Scraper](https://img.shields.io/badge/Store-Otodom%20Property%20Scraper-1AE392)](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) [![Store-ImmobilienScout24 Property Scraper](https://img.shields.io/badge/Store-ImmobilienScout24%20Property%20Scraper-FF3F19)](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian) [![Store-Smart Idealista Scraper](https://img.shields.io/badge/Store-Smart%20Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian)

#### 🎉 Every listing on Sreality with the fields a Czech buyer actually filters on: cena za m², disposition, panel or brick, and the energy label

##### Built for property analysts, realitní kanceláře, proptech teams and investors tracking the Czech market

***

### 🔎 What is the Sreality Scraper — and when should you use it?

The **Sreality Scraper** turns public Czech property listings from Sreality.cz, the country's largest portal into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** apartments, houses, land or commercial property anywhere in the Czech Republic, for sale, rent or auction. Every row carries the asking price in CZK, the price per square metre, the disposition in Czech layout notation (1+kk, 2+1, 3+kk), usable area, the full address with GPS, photos and the listing agency. Switch on full detail and you also get the floor, panel or brick construction, building condition, personal or cooperative ownership, the energy label, the amenities and the named agent with a phone and email.

**Use something else when:** the property is not on Sreality.cz. Use [ImmobilienScout24 Property Scraper](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian) for German residential listings, the neighbouring market Czech cross-border buyers compare against. Use [Otodom Property Scraper](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) for Polish listings, the other large Central European portal on the same buyer's shortlist. Use [Smart Idealista Scraper](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) for Spanish, Italian and Portuguese listings for a southern-Europe comparison set. This actor covers Sreality's public listings. Sold prices are not published anywhere on Sreality, so no column here reports what a property actually transacted for, and Czech stock that is only on Bezrealitky or Reality iDNES is out of scope.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/sreality-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Czech property listings and prices from Sreality.cz using the Apify Actor `sian.agency/sreality-property-scraper`.

Use it when I need: apartments, houses, land or commercial property anywhere in the Czech Republic, for sale, rent or auction. Every row carries the asking price in CZK, the price per square metre, the disposition in Czech layout notation (1+kk, 2+1, 3+kk), usable area, the full address with GPS, photos and the listing agency. Switch on full detail and you also get the floor, panel or brick construction, building condition, personal or cooperative ownership, the energy label, the amenities and the named agent with a phone and email.

Don't use it when: the property is not on Sreality.cz — use immobilienscout24-property-scraper or otodom-property-scraper or smart-idealista-scraper instead.

How to call it: give `propertyType` (`byty`, `domy`, `pozemky`, `komercni`, `ostatni`) and `transaction` (`prodej`, `pronajem`, `drazby`), then put Czech region or district names in `regions` (`Praha`, `Jihomoravsky kraj`, `Brno-mesto`, `Olomouc` — accents optional, empty means the whole country). Narrow with `dispositions`, `minPrice`, `maxPrice`, `minArea`, `maxArea`, `buildingTypes`, `ownership` and `maxAgeDays`. `includeDetails` adds the full record and the agent's contact details for an extra charge per property. To expand listings you already have, set `operation` to `detail` and pass `propertyUrls`; to reuse a search you built on sreality.cz, paste it into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "propertyType": "byty",
  "transaction": "prodej",
  "regions": [
    "Hlavní město Praha"
  ],
  "dispositions": [
    "2+kk",
    "3+kk"
  ],
  "maxResults": 200
}

Ask me which Czech region or district and whether they want sale or rent, and whether they need the agent contact details that full detail adds, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every 2+kk and 3+kk flat for sale in Prague and rank them by price per square metre.*
- *Find brick-built flats in Brno-mesto with personal ownership, listed in the last three days, and give me the agency for each.*
- *Compare asking rents against sale prices for 1+kk flats across all 14 Czech regions so I can see gross yield by region.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/sreality-property-scraper.md](https://apify.com/sian.agency/sreality-property-scraper.md).

### 📋 Overview

**Sreality.cz is the portal Czech buyers actually use.** Around 100,000 live listings, and usually the first place an agency posts a new instruction. This Actor reads it the way an analyst wants it read: one row per property, typed values, no HTML.

**What you get:**

- ✅ **The Czech fields that decide a deal**: price in koruna *and* price per square metre, disposition in local notation (1+kk, 2+1, 3+kk) and usable area on every row. Switch on full detail and the floor, panelová or cihlová construction, the energy label and the ownership type come with it.
- ⚡ **200 properties per request**: a whole region in a single run, and 200 rows arrive in under three seconds.
- 🎯 **Typed values, not scraped text**: price arrives as 9490000, not "9 490 000 Kč". Latitude and longitude are floats. Usable area is a number.
- 💰 **No charge for failures**: you pay per property returned. Error rows cost nothing.
- 💎 **Region names, not numeric ids**: type Praha, Jihomoravský kraj or Brno-město. Areas resolve against Sreality's own live codebook, so a renamed district works the same day.
- ❓ **Honest prices**: a listing marked "info o ceně" comes back flagged, with an empty price rather than a zero that would poison every average you compute.

***

### ✨ Features

- 🔍 **Search all 14 regions and 86 districts**: by name or SEO slug, accents optional. Leave the field empty for the whole country.
- 🏘️ **Every section of the portal**: apartments, houses, land, commercial and other — for sale, for rent or at auction.
- 🚪 **Czech disposition filters**: 1+kk through 5+1, plus "6 a více" and Atypický, using the same labels the site does.
- 🧱 **Panel versus brick**: the construction filter Czech buyers apply most, alongside personal or cooperative ownership.
- 🛡️ **A filter it cannot honour stops the run**: a mistyped disposition or building type returns an error row naming the accepted values, and costs nothing. It is never dropped, which would hand you the wider unfiltered set and bill you for all of it.
- 📐 **Area and price bands**: usable area in m² and price in CZK, each with a floor and a ceiling you set.
- 🗓️ **Listed in the last N days**: run it daily on a one-day window and pay only for what is new.
- 📄 **Optional full detail**: one switch adds the description, floor, energy label, amenities, view count, agency and named agent.
- 🌐 **Paste any Sreality search URL**: the deal type, property type and area in the path are read straight off it.
- 📍 **GPS on every row**: map it, geofence it, join it to your own boundaries.
- 🔢 **A hard row budget**: set the maximum and the run stops there. No surprise bills.

***

### 🎬 Quick Start

Pick a property type and a deal type, name an area, press Start. The Actor paginates, parses and writes one row per property to your dataset — then saves an HTML run report next to it.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~sreality-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","propertyType":"byty","transaction":"prodej","regions":["Praha"],"maxResults":200}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what and how

Pick a property type — **Apartments**, **Houses**, **Land**, **Commercial** or **Other** — and a deal type: **For sale**, **For rent** or **Auction**.

#### Step 2: Name your areas

Type Czech region, district or city names the way you say them: Praha, Jihomoravský kraj, Brno-město, Olomouc. Accents are optional. Add several and each one runs its own query in the same run.

#### Step 3: Set a row budget and run

**Max properties** caps the whole run. Turn on **Fetch full detail** if you need the floor, the energy label or the agent's contact details.

**That's it! In under a minute, you'll have:**

- One clean row per property, ready for CSV or Excel
- Price and price per square metre as numbers you can sort on
- An HTML report showing exactly what you were charged for

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` (default) or `detail` |
| `propertyType` | string | No | `byty`, `domy`, `pozemky`, `komercni`, `ostatni` |
| `transaction` | string | No | `prodej`, `pronajem`, `drazby` |
| `regions` | array | No | Czech region, district or city names, e.g. `["Praha","Brno-město"]`. Empty means the whole country |
| `dispositions` | array | No | `1+kk`, `2+1`, `3+kk`, `6 a více`, `Atypický` … |
| `minPrice` / `maxPrice` | integer | No | Price bounds in CZK (monthly rent for rentals). 0 means no bound |
| `minArea` / `maxArea` | integer | No | Usable area bounds in m². 0 means no bound |
| `buildingTypes` | array | No | `Panelová`, `Cihlová`, `Dřevostavba`, `Smíšená` … (`panel` and `brick` also accepted) |
| `ownership` | string | No | `any`, `osobni`, `druzstevni`, `statni` |
| `maxAgeDays` | integer | No | Only listings published within this many days. 0 means any age |
| `sort` | string | No | `-date`, `price_asc`, `price_desc` |
| `maxResults` | integer | No | Whole-run row budget (default 100) |
| `includeDetails` | boolean | No | Add description, floor, energy label, amenities, agency and agent |
| `propertyUrls` | array | No | Listing URLs or bare numeric IDs, for the `detail` operation |
| `searchUrls` | array | No | Sreality search URLs to read filters from |

**Example — flats for sale in Prague, 2+kk and 3+kk, under 9 million:**

```json
{
  "operation": "search",
  "propertyType": "byty",
  "transaction": "prodej",
  "regions": ["Hlavní město Praha"],
  "dispositions": ["2+kk", "3+kk"],
  "maxPrice": 9000000,
  "sort": "price_asc",
  "maxResults": 500
}
```

**Example — brick-built rentals in Brno listed in the last three days, with full detail:**

```json
{
  "operation": "search",
  "propertyType": "byty",
  "transaction": "pronajem",
  "regions": ["Brno-město"],
  "buildingTypes": ["Cihlová"],
  "maxAgeDays": 3,
  "includeDetails": true,
  "maxResults": 100
}
```

**Example — full detail for listings you already have:**

```json
{
  "operation": "detail",
  "propertyUrls": [
    "https://www.sreality.cz/detail/prodej/byt/3+1/praha-prosek-vysocanska/3046166604",
    "3046166604"
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **45+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `estateId` | number | Sreality's own listing ID |
| `estateUrl` | string | Canonical listing URL |
| `listingName` | string | The listing headline, e.g. "Prodej bytu 3+1 69 m²" |
| `priceCzk` | number | Asking price in CZK, or the monthly rent |
| `priceOnRequest` | boolean | True when the listing says "info o ceně" |
| `priceCzkPerSqM` | number | Price per square metre — the Czech comparison metric |
| `disposition` | string | 1+kk, 2+1, 3+kk … |
| `usableArea` | number | Usable floor area in m² |
| `region` / `district` / `city` / `cityPart` | string | Administrative area, down to the quarter |
| `street` / `houseNumber` / `zip` | string | Street address *(detail rows carry the fullest form)* |
| `latitude` / `longitude` | number | Coordinates |
| `floorNumber` / `totalFloors` | number | Floor, and floors in the building *(detail rows)* |
| `buildingType` | string | Panelová, Cihlová, Smíšená … *(detail rows)* |
| `ownershipType` | string | Osobní, Družstevní, Státní *(detail rows)* |
| `energyRating` | string | Czech energy label, e.g. "D - Méně úsporná" *(detail rows)* |
| `agencyName` / `agencyUrl` | string | Listing agency and its website *(detail rows)* |
| `agentName` / `agentEmail` / `agentPhones` | string, array | Named agent and published contacts *(detail rows)* |
| `isPrivateSeller` | boolean | True when no agency is behind the listing |
| `imageUrls` | array | Every photo on the listing |
| `poiDistances` | object | Metres to the metro, tram, school, doctor, shop and ten more |

**Example row (full detail):**

```json
{
  "estateId": 3046166604,
  "estateUrl": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-prosek/3046166604",
  "listingName": "Prodej bytu 3+1 69 m²",
  "propertyType": "Byty",
  "transaction": "Prodej",
  "disposition": "3+1",
  "priceCzk": 9490000,
  "priceOnRequest": false,
  "priceCzkPerSqM": 137536,
  "priceUnit": "za nemovitost",
  "usableArea": 69,
  "region": "Hlavní město Praha",
  "district": "Praha 9",
  "city": "Praha",
  "cityPart": "Prosek",
  "street": "Vysočanská",
  "zip": "19000",
  "latitude": 50.121445989,
  "longitude": 14.494135218,
  "floorNumber": 1,
  "totalFloors": 12,
  "buildingType": "Panelová",
  "buildingCondition": "Velmi dobrý",
  "ownershipType": "Osobní",
  "energyRating": "D - Méně úsporná",
  "furnished": "Částečně",
  "publishedAt": "2026-08-06",
  "updatedAt": "2026-08-29",
  "viewCount": 3598,
  "agencyName": "M&M Reality",
  "agencyUrl": "https://www.mmreality.cz/",
  "agencyReviewScore": 4.1,
  "agencyReviewCount": 5215,
  "agentName": "Hajžmanová Denisa",
  "agentEmail": "info@mmreality.cz",
  "agentPhones": ["+420296399006", "+420731404040"],
  "isPrivateSeller": false,
  "imageCount": 12,
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. Czech Housing Market & Price Analytics

**An analyst tracking asking prices by region and disposition.**

**Input:** one property type, one deal type, a list of regions, on a weekly schedule
**Output:** price, price per m², usable area and disposition on every row
**Use:** compare Praha 4 against Brno-město on one schema. Both numbers are typed, so a median is a spreadsheet formula rather than a parsing job.

#### 2. Estate Agency & Broker Lead Generation

**An agency selling services to Czech realitní kanceláře.**

**Input:** a region with full detail switched on
**Output:** the listing agency, its website, its Sreality rating and review count, plus the named agent with the phone and email published on the listing
**Use:** group by agency to rank who is winning instructions in that district, then work the list.

#### 3. Private-Seller and FSBO Discovery

**A buying agent or investor looking for owners who have not hired anyone.**

**Input:** any search — the private-seller flag is on every row
**Output:** listings with no agency behind them
**Use:** filter to those rows and you have the part of the Czech market that never reaches an agency's own feed.

#### 4. Investment & Yield Screening

**A landlord sizing up a Czech district.**

**Input:** the same area run twice, once for sale and once for rent, with the same disposition filter
**Output:** both halves of a gross-yield calculation for the same streets
**Use:** join on district and disposition. Switch on full detail and the ownership type comes too, which is what decides whether a flat is mortgageable at all.

#### 5. New-Listing Alerts

**A buyer who wants to see new instructions the morning they land.**

**Input:** one region, listed in the last 1 day, on a daily schedule
**Output:** only what appeared since yesterday
**Use:** a region drops from thousands of listings to a few dozen, so the run costs pennies and every row is genuinely new.

#### 6. Energy Label and Retrofit Targeting

**An insulation, window or heat-pump business building a prospect list.**

**Input:** a region with full detail switched on
**Output:** every property with its energy label and construction type
**Use:** filter to labels D through G in panelová buildings — the stock facing the biggest efficiency gap.

#### 7. Proptech and AI Agent Data Feeds

**A product that needs live Czech listings behind it.**

**Input:** the API or MCP call, on demand
**Output:** typed JSON with coordinates, ZIP and district
**Use:** the district and ZIP join straight to Czech statistical and cadastral datasets.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/sreality-property-scraper').call({
  operation: 'search',
  propertyType: 'byty',
  transaction: 'prodej',
  regions: ['Hlavní město Praha'],
  dispositions: ['2+kk', '3+kk'],
  maxResults: 500,
});

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

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/sreality-property-scraper').call(
    run_input={
        'operation': 'search',
        'propertyType': 'byty',
        'transaction': 'pronajem',
        'regions': ['Brno-město'],
        'maxAgeDays': 3,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['listingName'], item['priceCzk'], item['priceCzkPerSqM'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~sreality-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","propertyType":"domy","transaction":"prodej","regions":["Jihomoravský kraj"],"maxResults":300}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the Actor with `maxAgeDays: 1`
3. **Process**: filter the returned rows on your own price-per-m² threshold
4. **Action**: write to a sheet, post to Slack, or start an outreach sequence

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 properties** per run — every field, every filter, same quality
- No credit card required
- Enough to check the output shape against your own pipeline

#### PAID Tier (Production Ready)

- **Unlimited** properties per run
- 200 properties per request — a 1,000-row sweep finishes in seconds
- Pay-per-result: charged per property returned, never for an error row

💰 **You are charged for what you receive.** Full detail is a separate, optional add-on — leave the switch off and you pay for search rows only.

🔗 [View current pricing](https://apify.com/sian.agency/sreality-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need an API key, a proxy or a login?**
A: No. Pick a property type, name an area and press Start.

**Q: Is there a public Sreality API I could call myself?**
A: There was, and it is gone. The endpoint every older tutorial and several Store scrapers still reference returns HTTP 404. The portal moved to another path that paginates differently, and this Actor tracks the live one. Some competing tools still point at the dead one and return nothing at all.

**Q: How many listings can one search return?**
A: About 10,000 per query. That ceiling belongs to Sreality, not to this Actor. To go wider, add regions or districts — each one runs its own query in the same run — or split by disposition or price band.

**Q: Which area names work?**
A: All 14 regions, all 86 districts and the cities and quarters underneath them, by name or by the slug Sreality uses in its own URLs. Accents are optional, so Brno-mesto finds Brno-město. An unrecognised name returns a clear error row rather than silently scraping the whole country.

**Q: What happens to listings marked "info o ceně"?**
A: They come back with the price-on-request flag set and an empty price, so a numeric zero never lands in your averages. They are roughly three percent of the sale market. Setting a minimum or maximum price excludes them, because Sreality's own filter does.

**Q: Does it return the agent's phone number and email?**
A: Yes, on agency-marketed listings with full detail switched on. Those are the contacts Sreality publishes on the listing page itself. Private-seller listings carry no agency and are flagged as such on every row.

**Q: What does "Fetch full detail" cost?**
A: It reads each listing's own record, so it bills one Property Detail event per property on top of the search row. It is the only way to get the floor, the energy label, the ownership type and the agent's contacts.

**Q: Can I get sold prices or price history?**
A: No. Sreality publishes asking prices. What a Czech property actually transacted for is recorded by the cadastre, and no column here reports it.

**Q: Can I paste a Sreality search URL?**
A: Yes. Put it in Search URLs and the deal type, property type and the region or district in the path are read off it.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

***

### 🐛 Troubleshooting

**"is not a Czech region or district on Sreality"**

- Use the region, district or city name as Sreality writes it: Praha, Jihomoravský kraj, Brno-město, Olomouc.
- Accents are optional, but a partial name that matches two areas is reported rather than guessed. Give the full name.

**"is not a Sreality disposition for this property type"**

- Dispositions differ by section: 3+kk exists for apartments, and houses use their own sub-types instead.
- The error row lists the values this property type accepts. Fix the spelling or clear the field — nothing is charged for a rejected filter.

**A search returns fewer rows than the site's counter claims**

- Every query stops at an offset of roughly 10,000 rows. The counter above it will happily read 21,188.
- Split the query: add regions or districts, narrow the price band, or filter by disposition.

**Floor, energy label or ownership are empty**

- Those live on the listing's own record. Turn on **Fetch full detail**.
- Some advertisers simply do not supply them. A missing value comes back empty rather than as a fake one.

**The price column is empty on some rows**

- Those listings say "info o ceně" and carry the price-on-request flag. Sreality publishes no number for them.

**The run stopped before my row budget**

- On the FREE tier a run stops at 25 properties. Add credits for unlimited rows.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Sreality.cz is a trademark of Seznam.cz, a.s. This actor is not affiliated with, endorsed by, or sponsored by Seznam.cz.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

🎯 **PICK ONE PER RUN.**

🔍 **Property Search** returns listing rows for a section, deal type and area, with every filter below applied. This is the one you want almost always.

📄 **Property Detail** takes Sreality listing URLs or bare numeric IDs and returns the full record for each one.

💡 Want the full record on a SEARCH run instead? Leave this on Property Search and switch on **Fetch full detail** below.

## `propertyType` (type: `string`):

🏘️ **WHICH SREALITY SECTION** to search.

🏢 **Apartments** and 🏡 **Houses** carry the richest rows: disposition, usable area, floor, building type and energy label.

🌾 **Land** and 🏬 **Commercial** rows have no disposition, so the Dispositions filter below does nothing for them.

💡 One section per run. To sweep several, schedule one run each and pay only for the rows each one returns.

## `transaction` (type: `string`):

💱 **SALE, RENT OR AUCTION.**

💰 **For sale** prices are the asking price for the whole property.

🔑 **For rent** prices are the MONTHLY rent. The unit is stated in the `priceUnit` column of every row, so you never have to guess.

⚖️ **Auction** covers court and insolvency sales.

💡 Run one area for sale and again for rent, join on district and disposition, and you have a gross yield map.

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

🗺️ **WHERE TO SEARCH.** One Czech region or district per line, by name or by Sreality's own slug: `Praha`, `Hlavní město Praha`, `Jihomoravsky kraj`, `Brno-mesto`, `Olomouc`.

✍️ **Accents are optional.** Names are resolved against Sreality's live list at run time, so you never look up a numeric ID.

⬜ **Empty searches the whole Czech Republic.**

🚀 One Sreality query serves at most ~10,000 rows. Each line here runs its own query, so more areas means more reach.

## `dispositions` (type: `array`):

🚪 **CZECH LAYOUTS TO INCLUDE**, one per line: `1+kk`, `1+1`, `2+kk`, `2+1`, `3+kk`, `3+1`, `4+kk`, `4+1`, `5+kk`, `5+1`, `6 a vice`, `Atypicky`.

⬜ **Empty means all of them.**

🏡 For Houses, Land and Commercial the sub-types of that section are accepted by name instead. The layout list above is apartments only.

⚠️ A name Sreality does not recognise stops the search and returns an error row naming the values it accepts. A rejected filter costs nothing.

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

💵 **CHEAPEST LISTING TO INCLUDE**, in Czech koruna.

⬜ **0 means no lower bound** (the default).

🔑 For rentals this is the MONTHLY rent, not an annual figure.

🎯 A price band makes the run both faster and cheaper, because the rows outside it are never fetched and never billed.

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

💰 **MOST EXPENSIVE LISTING TO INCLUDE**, in Czech koruna.

⬜ **0 means no upper bound** (the default).

❓ About 3% of sale listings say `info o ceně` and carry no price at all. Those come back with `priceCzk` empty and `priceOnRequest` true, never a misleading 0, and **any price filter excludes them**.

🎯 Pair with Min price to sweep one band at a time and reach past the per-query row ceiling.

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

📐 **SMALLEST USABLE FLOOR AREA** to include, in square metres.

⬜ **0 means no lower bound** (the default).

📏 Usable area is Sreality's `užitná plocha`, the interior floor area of the unit.

💡 Combine it with a price band to isolate one price-per-m2 class and study that instead of the whole market.

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

📏 **LARGEST USABLE FLOOR AREA** to include, in square metres.

⬜ **0 means no upper bound** (the default).

🎯 Use it with Min usable area to take one size class at a time.

📊 Every row also carries `priceCzkPerSqM`, computed by Sreality itself, so you can rank on price per m2 without doing the division.

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

🧱 **CONSTRUCTION TYPE**, one per line, in Czech: `Panelova`, `Cihlova`, `Drevostavba`, `Kamenna`, `Montovana`, `Skeletova`, `Smisena`, `Modularni`.

✍️ **Accents are optional**, and a partial name is enough: `panel` finds Panelová.

🎯 **Panel versus brick is the filter Czech buyers apply most.** Prefab panel blocks and brick buildings trade at visibly different prices per m2 in the same street.

⬜ Empty means all of them. An unrecognised name stops the search and costs nothing.

## `ownership` (type: `string`):

📜 **PERSONAL OR COOPERATIVE OWNERSHIP.** This is what decides whether a Czech flat can be mortgaged at all.

🔑 **Personal (osobní)** is freehold: the buyer owns the unit and a bank lends against it normally.

🤝 **Cooperative (družstevní)** is a share in a housing cooperative. Most Czech banks will not lend against one, which is why it trades at a discount.

🏛️ **State or municipal** is a small residual class.

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

🗓️ **ONLY LISTINGS PUBLISHED IN THE LAST N DAYS.**

⬜ **0 means any age** (the default).

⏰ **This is the scheduling switch.** Set it to 1 and run daily and you pay for what is new since yesterday, instead of re-buying the whole market every morning.

🎯 Agencies pick up new instructions and private-seller listings within hours, so being first is most of the value.

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

🔀 **WHICH LISTINGS COME FIRST**, and therefore which ones you get when Max properties cuts the run short.

⚠️ **Sreality's 'most recently updated' is the LAST EDIT date, not the first publication date.** A three-month-old listing whose price was cut this morning sits at the top. For genuinely new stock use **Listed in the last N days** above.

⬆️⬇️ Cheapest and most expensive first are the bargain-hunting and prime-stock sorts.

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

🔢 **STOP AFTER THIS MANY PROPERTIES**, counted across every area in the run.

📦 Listings are read 200 at a time and the run stops on the row that hits your number, so you are never billed for a rounded-up batch.

💰 **Free accounts are capped at 25 rows per run** whatever you type here. Paid accounts are not.

⚠️ Sreality serves at most ~10,000 rows per query. Split by area or price band to go past that.

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

📄 **THE WHOLE LISTING, NOT ONLY THE SEARCH CARD.** Adds the full description, floor number and floors in the building, building type and condition, energy label, amenities (lift, balcony, terrace, cellar, garage), view count, and the listing agency plus the named agent with their public phone and email.

💰 **Charged per enriched property** on top of the search row.

🎯 **Worth it for:** agency and agent lead generation.
❌ **Skip it for:** price and yield analytics.

## `propertyUrls` (type: `array`):

🔗 **FOR PROPERTY DETAIL MODE:** the listings you want the full record for.

📱 Open the listing on sreality.cz and copy the address bar, e.g. `https://www.sreality.cz/detail/prodej/byt/3+1/praha-prosek-vysocanska/3046166604`. The bare numeric ID from the end of that URL works on its own too.

📝 **Bulk edit** pastes one per line. 📁 Upload a .txt file. 🔗 **+ Add** for one at a time.

⚠️ Ignored while the operation above is Property Search.

## `searchUrls` (type: `array`):

🌐 **PASTE A SREALITY SEARCH INSTEAD OF FILLING THE FORM ABOVE**, e.g. `https://www.sreality.cz/hledani/prodej/byty/praha`.

🎛️ The deal type, section and area in the path are read straight off each URL, and they win over the fields above for that one search.

➕ Search URLs run **in addition to** the areas listed above.

⚠️ Only the path is read. Query-string filters are not, so set those in the fields above.

## Actor input object example

```json
{
  "operation": "search",
  "propertyType": "byty",
  "transaction": "prodej",
  "regions": [
    "Hlavní město Praha"
  ],
  "dispositions": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "buildingTypes": [],
  "ownership": "any",
  "maxAgeDays": 0,
  "sort": "-date",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": []
}
```

# Actor output Schema

## `srealityProperties` (type: `string`):

One row per property: price in CZK and per m2, disposition, usable area, region, district, city, street, GPS, every photo URL and the private-seller flag, plus the description, floor, energy label, amenities and agency contact when full detail is on

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "propertyType": "byty",
    "transaction": "prodej",
    "regions": [
        "Hlavní město Praha"
    ],
    "dispositions": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minArea": 0,
    "maxArea": 0,
    "buildingTypes": [],
    "ownership": "any",
    "maxAgeDays": 0,
    "sort": "-date",
    "maxResults": 100,
    "includeDetails": false,
    "propertyUrls": [],
    "searchUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/sreality-property-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 = {
    "operation": "search",
    "propertyType": "byty",
    "transaction": "prodej",
    "regions": ["Hlavní město Praha"],
    "dispositions": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minArea": 0,
    "maxArea": 0,
    "buildingTypes": [],
    "ownership": "any",
    "maxAgeDays": 0,
    "sort": "-date",
    "maxResults": 100,
    "includeDetails": False,
    "propertyUrls": [],
    "searchUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/sreality-property-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 '{
  "operation": "search",
  "propertyType": "byty",
  "transaction": "prodej",
  "regions": [
    "Hlavní město Praha"
  ],
  "dispositions": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "buildingTypes": [],
  "ownership": "any",
  "maxAgeDays": 0,
  "sort": "-date",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": []
}' |
apify call sian.agency/sreality-property-scraper --silent --output-dataset

```

## MCP server setup

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