Sreality Listings Scraper
Pricing
from $1.79 / 1,000 results
Sreality Listings Scraper
Scrape public Sreality search results for apartments, houses, land, commercial properties or other listings, for sale or rent. Records include titles, layouts, areas, prices, location fields, coordinates and image URLs.
Pricing
from $1.79 / 1,000 results
Rating
0.0
(0)
Developer
Axiom Works
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Sreality Property Scraper
Returns: one row per Sreality listing with id, title, offerType, layout, areaM2, priceCzk, city and sourceUrl.
Input: {"offerType": "rent", "category": "apartments", "region": "praha", "maxItems": 25, "includeDetails": false}
Best for: rent and price monitoring, property market research, lead lists of agencies and listings.
{"id": "1724305484","title": "Pronájem bytu 2+kk 54 m²","offerType": "rent","layout": "2+kk","areaM2": 54,"priceCzk": 41800,"city": "Praha","sourceUrl": "https://www.sreality.cz/detail/pronajem/byt/2+kk/praha-vinohrady-namesti-jiriho-z-podebrad/1724305484"}
What does Sreality Property Scraper do?
Sreality Property Scraper collects property listings from Sreality, the Czech property portal. You choose whether you want listings for sale or for rent, pick a category (apartments, houses, land, commercial or other), and optionally narrow the search to a region or city. The Actor then reads the public search result pages and returns one clean record per listing, ready for a spreadsheet, a database or a data pipeline.
Each record contains the listing title, offer type, category, layout or subtype, floor area, plot area, asking price in Czech crowns, price per square metre, the full location breakdown (city, city part, district, region, street), GPS coordinates, the agency that published the ad and the photo URLs. If you switch on detail pages, the Actor also opens every listing and adds the full Czech description, the agency name and a set of building parameters such as condition, construction type and ownership.
The Actor needs no login and no account. It reads only the public pages that anybody can open in a browser. Seller contact details such as phone numbers and personal names are deliberately not collected.
Typical uses include market research on asking prices and rents, scheduled runs to build a price history, feeding a property dashboard or valuation model, and mapping supply from the coordinates of each listing.
This Actor is an independent tool. It is not affiliated with or endorsed by Sreality or its operator.
What data can you get?
Every record has an id and a sourceUrl. The table lists all fields. Fields marked "details" are filled only when includeDetails is on. The propertyType field is filled only when AI enrichment is on and succeeded.
| Field | Type | Description |
|---|---|---|
id | string | Sreality listing identifier, unique within a run |
sourceUrl | string | Detail page URL of the listing |
title | string | Listing title as shown on the site, in Czech |
offerType | string | sale or rent |
category | string | apartments, houses, land, commercial or other |
layout | string | Layout such as 2+kk, or the subtype such as Rodinný or Pole |
areaM2 | number | Area in square metres, taken from the listing title |
plotAreaM2 | number | Plot area in square metres for houses and land |
priceCzk | number | Asking price in CZK; monthly rent for rentals; empty when the price is on request |
priceUnit | string | What the price covers, for example za měsíc or za nemovitost |
pricePerM2Czk | number | Price per square metre in CZK as given by the site |
city | string | City or municipality |
cityPart | string | City part or neighbourhood |
district | string | District |
region | string | Region (kraj) |
street | string | Street name when the listing shows one |
latitude | number | Latitude of the listing |
longitude | number | Longitude of the listing |
agencyId | number | Agency identifier |
agencySlug | string | Agency URL slug |
agencyName | string | Agency name (details) |
imageUrls | array | Photo URLs of the listing |
hasVideo | boolean | Whether the listing has a video |
description | string | Full listing description in Czech (details) |
previousPriceCzk | number | Earlier price when the listing shows a price drop (details) |
matterportUrl | string | 3D tour link when present (details) |
listedSince | string | Date the listing was first published (details) |
lastEdited | string | Date the listing was last edited (details) |
agencyRating | number | Agency review score on Sreality (details) |
agencyWebsite | string | Agency website (details) |
buildingParams | object | Selected building parameters such as condition, construction type, ownership, floor and elevator (details) |
propertyType | string | AI estimate: investment, family, starter, luxury or other |
Some fields are empty for some listings because the listing itself does not provide them. Street names, for example, are often hidden for houses in villages, and some agencies do not publish a price. A price shown as "price on request" is returned as empty rather than as a placeholder number.
How to use
- Open the Actor in Apify Console and go to the Input tab.
- Pick the offer type (sale or rent) and the category.
- Optionally type a region or city slug. The slug is the last part of a Sreality search address, for example
prahaorjihomoravsky-kraj. - Set
maxItemsto the number of listings you need. - Press Start. Results appear in the Output tab as soon as the first page has been read, and you can download them as JSON, CSV, Excel or XML.
If you already have a Sreality search address that includes the filters you want, paste it into Start URLs instead. The Actor then follows that search and ignores the offer type, category and region fields. You can also supply /detail/ listing addresses. These targets always include available detail fields. Filters apply to search targets, not individual listings.
Large result sets are best split by region. Sreality limits how deep a single search can page, so running one search per region gives you more complete coverage than one national search.
The Actor is polite to the site: it keeps to about one request per second with low concurrency, and it retries temporary failures with a growing delay. A run of 50 listings without detail pages takes a few seconds. With detail pages every listing needs one extra request, so the run is slower.
New in this version
- Price filters
minPriceandmaxPricenarrow generated searches and/hledani/start URLs. A start URL that already contains its owncena-odorcena-dokeeps those values.
Start URLs may also be single /detail/ listing URLs. Each is fetched with full details and saved as one record. Detail records fill previousPriceCzk, matterportUrl, listedSince, lastEdited, agencyRating and agencyWebsite when the listing shows them; otherwise these stay empty.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | none | Optional search URLs (/hledani/), listing URLs (/detail/) as URL objects. Overrides offer type, category and region |
offerType | string | sale | sale or rent |
category | string | apartments | apartments, houses, land, commercial or other |
region | string | empty | Region or city slug, for example praha |
minPrice | integer | 0 | Minimum price in CZK (monthly rent or sale price); 0 means no minimum |
maxPrice | integer | 0 | Maximum price in CZK; 0 means no maximum |
maxItems | integer | 50 | Shared maximum unique listings across all targets, 1 to 10000 |
includeDetails | boolean | false | Open each detail page for description, agency name and building parameters |
enableAiEnrichment | boolean | true | Add the propertyType estimate |
proxyConfiguration | object | no proxy | Apify Proxy settings |
Example input:
{"offerType": "rent","category": "apartments","region": "praha","maxItems": 25,"includeDetails": false}
Example input with a search address:
{"startUrls": [{ "url": "https://www.sreality.cz/hledani/prodej/domy/jihomoravsky-kraj" }],"maxItems": 25}
If a search returns no records, check the region URL slug, widen the price range, or try a known public search URL. For an unavailable listing, replace its detail URL. If requests remain blocked, select an available Apify Proxy group or try later. Empty and blocked targets do not produce placeholder records and end successfully with an explanation.
The maxItems limit is shared across all targets and exact: a run with maxItems set to 7 returns exactly 7 listings when at least 7 exist, and only those 7 are billed.
Output
Each run writes one dataset item per listing. Here is a shortened real item from a run with the first example input:
{"id": "1724305484","sourceUrl": "https://www.sreality.cz/detail/pronajem/byt/2+kk/praha-vinohrady-namesti-jiriho-z-podebrad/1724305484","title": "Pronájem bytu 2+kk 54 m²","offerType": "rent","category": "apartments","layout": "2+kk","areaM2": 54,"plotAreaM2": null,"priceCzk": 41800,"priceUnit": "za měsíc","pricePerM2Czk": 774,"city": "Praha","cityPart": "Vinohrady","district": "Praha 3","region": "Hlavní město Praha","street": "náměstí Jiřího z Poděbrad","latitude": 50.078582,"longitude": 14.449973,"agencyId": 20262,"agencySlug": "prime-property","agencyName": null,"imageUrls": ["https://d18-a.sdn.cz/d_18/c_img_qE_A/nO573v8MsNBK7ALGmsHbP2a4/3c99.jpeg"],"hasVideo": false,"description": null,"buildingParams": null,"previousPriceCzk": null,"matterportUrl": null,"listedSince": null,"lastEdited": null,"agencyRating": null,"agencyWebsite": null,"propertyType": null}
With includeDetails on, agencyName, description and buildingParams are filled, for example {"buildingCondition": "Velmi dobrý", "buildingType": "Cihlová", "floors": 1, "furnished": "Ano"}. Explicit boolean values are preserved: "balcony": false means the source reports no balcony; an absent key means the source did not supply a usable value. A numeric floorNumber of zero is preserved, while zero-valued area placeholders and unselected enum options are omitted. The data is returned in Czech, exactly as published, so titles, descriptions and condition names are not translated.
How much does it cost?
The Actor is charged per result: each listing saved to the dataset counts as one result. When AI enrichment is on and succeeds for a listing, that listing also counts as an enriched result. If enrichment fails or is switched off, no enrichment charge applies. See the Pricing tab of the Actor for the current rates, which can change over time. Setting a low maxItems is the simplest way to control the cost of a run, and a run stops as soon as that many listings have been saved.
Use with AI agents (MCP)
You can call this Actor from any MCP-compatible AI assistant through the Apify MCP server. Add it to your client configuration like this:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=axiomworks/sreality-property-scraper"}}}
Example prompts:
- "Find 30 apartments for rent in Prague on Sreality and list the cheapest ones per square metre."
- "Get houses for sale in the South Moravian region and group them by district."
- "Collect 20 commercial listings for rent in Praha with descriptions and agency names."
The input field descriptions are written so that an agent can choose the right values without extra help.
Integrations and API
You can run the Actor from code and read the results through the Apify API.
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("axiomworks/sreality-property-scraper").call(run_input={"offerType": "sale", "category": "apartments", "region": "praha", "maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["priceCzk"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('axiomworks/sreality-property-scraper').call({offerType: 'rent',category: 'houses',region: 'jihomoravsky-kraj',maxItems: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();process.stdout.write(`${items.length} items\n`);
cURL:
curl -X POST "https://api.apify.com/v2/acts/axiomworks~sreality-property-scraper/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"offerType":"sale","category":"land","maxItems":20}'
You can also schedule runs, send results to Google Sheets, Slack or a webhook, or connect the Actor to automation tools using the integrations built into the platform.
FAQ
How many listings can I get in one run? Up to 10000 per run, limited by what the search returns. Sreality caps how deep one search can page, so for complete coverage run one search per region.
Why are some prices empty? Some listings are published as "price on request". The Actor returns an empty price for them instead of a placeholder.
Why is the area missing for some listings? The area is read from the listing title. If the title does not state an area, the field is empty.
Do I need a proxy? Usually not. Requests go direct by default. If the site blocks a request or answers it with an error, the Actor retries on a fresh Apify Proxy session, first datacenter and then residential, and uses the successful route for later pages in the same run. You can also pick a proxy group in the input to always use one.
Is the text translated? No. Titles, descriptions and parameter names are in Czech, as published.
Does the Actor collect seller phone numbers or names? No. Seller contact details are personal data and are not collected. The record contains only the agency identifier, slug and, with detail pages, the agency name.
What does the AI enrichment do?
It adds a propertyType estimate based on layout, area, price and description. Enrichment uses a third-party AI processor. You can switch it off with enableAiEnrichment.
What happens with a wrong region or a dead URL? The run finishes quickly with zero results and a warning in the log. No placeholder items are written.
Is it legal to scrape Sreality?
The Actor reads publicly available listing pages without logging in and without bypassing any protection. Property listing data is generally public information, but you are responsible for how you use it. Check the site's terms of use and the rules that apply to you, including database rights and data protection law such as the GDPR. Do not use the data to contact private individuals in ways the law does not allow. This Actor does not collect seller contact details. If you are unsure about your use case, ask a lawyer.
Feedback
If a field is missing, a region does not work or the site layout changes, open an issue on the Actor page in Apify Console and describe the input you used. Reports with an example run link are the quickest to fix.